Ani*_*Ani 11
如果你想有条件地将Foo投射到另一个Foo(让其他人保持不变),你可以做以下事情:
IEnumerable<Foo> foos = ...
var transformed = foos.Select(foo => myCondition(foo) ? transform(foo) : foo);
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您只想投影符合条件的Foos:
var transformed = foos.Where(foo => myCondition(foo))
.Select(foo => transform(foo));
Run Code Online (Sandbox Code Playgroud)
请注意,这两个都返回新序列 - LINQ通常不用于修改现有集合.当然,您可以将结果具体化为集合,并在必要时覆盖现有变量.
// assuming the transform is from Foo -> Foo
foos = foos.Select(foo => transform(foo)).ToList();
Run Code Online (Sandbox Code Playgroud)
由于您特别提到了列表,因此第一个查询还有另一个非LINQ立即执行替代List<T>.ConvertAll方法- 方法:
List<Foo> foos = ...
// implicitly List<Foo> assuming the transform is from Foo -> Foo
var transformed = foos.ConvertAll
(foo => myCondition(foo) ? transform(foo) : foo);
Run Code Online (Sandbox Code Playgroud)
编辑:听起来你正在寻找一个"ReplaceWhere"方法 - 据我所知,没有直接的框架方法可以替换基于谓词的列表元素.虽然你自己写一个很容易:
/// <summary>
/// Replaces items in a list that match the specified predicate,
/// based on the specified selector.
/// </summary>
public static void ReplaceWhere<T>(this IList<T> list,
Func<T, bool> predicate,
Func<T, T> selector)
{
// null-checks here.
for (int i = 0; i < list.Count; i++)
{
T item = list[i];
if (predicate(item))
list[i] = selector(item);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
List<int> myList = ...
myList.ReplaceWhere(i => i > 0, i => i * i);
Run Code Online (Sandbox Code Playgroud)