LINQ转换函数

Mub*_*han 3 c# linq

只是我的一个奇怪的问题,是否有任何变换功能在linq.我的意思是,如果我有List<int>List<Foo>,我想改变索引x处的元素或满足条件在Where中的元素.

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)

  • +1一个`ReplaceWhere`扩展程序总是设法进入我工作的每个项目. (2认同)