gpt4 book ai didi

c# - LINQ 转换函数

转载 作者:行者123 更新时间:2023-11-30 13:18:04 26 4
gpt4 key购买 nike

我只是想问一个奇怪的问题,linq 中是否有任何转换函数。我的意思是如果我有 List<int>List<Foo> ,我想更改索引 x 处的元素或满足 Where 中条件的任何人。

最佳答案

如果您希望有条件地将一个 Foo 投影到另一个 Foo(让其他 Foo 保持不变),您可以这样做:

IEnumerable<Foo> foos = ...

var transformed = foos.Select(foo => myCondition(foo) ? transform(foo) : foo);

另一方面,如果您只想投影符合条件的 Foos:

var transformed = foos.Where(foo => myCondition(foo))
.Select(foo => transform(foo));

请注意,这两个都返回 序列 - LINQ 通常不用于修改 现有集合。您当然可以将结果具体化到一个集合中,必要时覆盖现有变量。

// assuming the transform is from Foo -> Foo
foos = foos.Select(foo => transform(foo)).ToList();

由于您特别提到了列表,因此第一个查询还有另一个非 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);

编辑:听起来您正在寻找一种“ReplaceWhere”方法 - 据我所知,没有直接框架方法可以替换 a 的元素基于谓词的列表。不过自己写一个很容易:

/// <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);
}
}

用法:

List<int> myList = ...
myList.ReplaceWhere(i => i > 0, i => i * i);

关于c# - LINQ 转换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4506258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com