【问题标题】:How to create extension method taking lambda expression如何创建采用 lambda 表达式的扩展方法
【发布时间】:2011-04-06 07:02:38
【问题描述】:

您好,

我正在寻找一种转换方式

foreach (var sEvent in Events)
{
    sEvent.SomeId = 0;
}

Events.Set(m=>m.SomeId, 0); 

或类似的东西。

所以基本上我想让它成为一个单行事件,将所有“SomeId”设置为 0;

有什么办法吗?

【问题讨论】:

  • 没有“Lambda 扩展”,您将 2 个概念合二为一:“Lambda 表达式”和“扩展方法”。
  • 是的,但我正在寻找一种在扩展中实现 lambda 的方法。但似乎已经有一种方法可以满足我的要求。
  • 我的只是一个澄清。更准确地说,标题应该是“如何创建采用 lambda 表达式的扩展方法”。不过你的目的很明确:)
  • 感谢您的评论!

标签: c# lambda extension-methods


【解决方案1】:

如果EventsList<T>,您可以使用:

Events.ForEach( m => m.SomeId = 0 );

如果EventsIEnumerable,则ForEach 未实现,但您当然可以自己制作适用于IEnumerable 的ForEach。没有为IEnumerable 创建ForEach 的原因是they did not want to have extension method on IEnumerable with side effects(改变了原始集合)。

在 IEnumerable 上实现 ForEach 非常简单:

public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
  foreach (T element in source) 
    action(element);
  return source;
}

这必须像所有其他扩展方法一样进入static 类。

【讨论】:

  • @Kirk Woll - 参考 Eric Lippert 的博客通常是个好主意 :)
【解决方案2】:

你可以这样做

Events.ToList().ForEach(Event => Event.SomeId = 0);

【讨论】:

    【解决方案3】:

    如果EventsList&lt;T&gt;,您可以简单地使用

    Events.ForEach(e => e.SomeId = 0);
    

    【讨论】:

      【解决方案4】:

      如果事件是一个列表,你可以这样做:

      Events.ForEach(m => m.SomeId = 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多