是否可以使用以下内容修改集合的元素,例如List,LinkedList等:
collection.Do ( action )
其中包括:
item.Value = 0
(for each item)
我知道调查员只提供价值,而不是参考,因此问题。
如何使用LINQ做到这一点?
答案 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);
}