使用LINQ直接修改值?

时间:2009-05-09 22:41:57

标签: c# .net linq

是否可以使用以下内容修改集合的元素,例如List,LinkedList等:

collection.Do ( action )

其中包括:

item.Value = 0
(for each item)

我知道调查员只提供价值,而不是参考,因此问题。

如何使用LINQ做到这一点?

2 个答案:

答案 0 :(得分:6)

尝试:

void ModifyEach<T>(this IList<T> list, Func<T, T> modifier)
{
    for (int n = 0; n < list.Count; n++)
        list[n] = modifier(list[n]);
}

用法:

List<int> x = new List<int> { 1, 3, 7 };

x.ModifyEach(n => n + 1); // increment each item

答案 1 :(得分:2)

如果您的收藏集包含引用类型,那么您可以使用扩展方法就地修改其项目,类似于ForEach上的List<T>方法。

这是可能的,因为您实际上并没有尝试更改IEnumerable<T>序列:集合包含引用,但您只修改引用的对象,而不是引用本身。

此技术不适用于值类型的集合。在这种情况下,您将尝试更改只读,IEnumerable<T>序列,这​​是不可能的。

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

// ...

public class Example
{
    public int Value { get; set; }
}

// ...

Example[] examples =
    {
        new Example { Value = 1 }, new Example { Value = 2 },
        new Example { Value = 3 }, new Example { Value = 4 }
    };

examples.ForEach(x => x.Value *= 2);

// displays 2, 4, 6, 8
foreach (Example e in examples)
{
    Console.WriteLine(e.Value);
}