获取相同的元素而不使用Linq更改它

时间:2009-12-11 21:22:33

标签: c# .net linq collections

我有这样的方法:

public List<Fruit> Traverse (IEnumerable<Fruit> collection, Action<Fruit> action)

我可以这样做:

Traverse (array, f => f.Text);

如何调用动作以获得相同的元素?

Traverse (array, f => f);

C#编译器不允许我这样做。

编辑:

List<Fruit> result = ...
foreach (Fruit fruit in collection)
{
    result.Add(fruit);
    action(fruit);
}

方法签名是固定的,所以我只能通过使用动作来获取其他任何东西,对吧?但我需要的是传递一个什么都不做的动作,这样我就得到了整个结果列表。

4 个答案:

答案 0 :(得分:3)

Action不是一个什么都不返回的委托?怎么样:

Traverse(array, e => {});

答案 1 :(得分:1)

您的方法声明似乎不正确......

如果你有这个:

public List<string> Traverse (IEnumerable<string> collection, Action<string> action)

你不能传递这个:

Traverse (array, e => e.Text);

这将要求每个元素都支持“Text”属性。 String没有Text属性。

如果您通过IEnumerable<string>,那么e => e将评估为Func<string, string>。你正在返回字符串。

如果你想要Action<string>,你需要对不返回值(e)的字符串做一些事情。

答案 2 :(得分:1)

您已将Traverse方法设置错误。您需要在此处使用通用签名并返回Func<T>

public List<T> Traverse (IEnumerable<T> collection, Func<T,T> del)

答案 3 :(得分:1)

Action<string>接受字符串参数但不返回任何内容,类似于签名为void Foo(string bar)的方法。

如果您使用action参数填充返回值,则需要将操作替换为Func<string, string>,后者采用字符串参数并返回字符串,类似于带有签名{{的函数1}}。