gpt4 book ai didi

c# - 使用 linq 拆分列表

转载 作者:太空狗 更新时间:2023-10-29 17:38:29 25 4
gpt4 key购买 nike

我有以下代码:

  var e = someList.GetEnumerator();
var a = new List<Foo>();
var b = new List<Foo>();
while(e.MoveNext()) {
if(CheckCondition(e.Current)) {
b.Add(e.Current);
break;
}
a.Add(e.Current);
}

while(e.MoveNext())
b.Add(e.Current)

这看起来很丑。基本上,遍历一个列表并将元素添加到一个列表直到出现某些条件,然后将其余元素添加到另一个列表。

有没有更好的方法,例如使用林克? CheckCondition() 很昂贵,而且列表可能很大,所以我宁愿不做任何重复列表两次的事情。

最佳答案

这里有一个解决方案,将枚举列表两次,但第二次不会检查条件,所以它应该更快:

var a = someList.TakeWhile(x => !CheckCondition(x)).ToList();
var b = someList.Skip(a.Count).ToList();

如果 someList工具 IList<T> ,每个项目实际上只会被枚举一次,所以不会有任何惩罚。
我以为 Skip针对 IList<T> 的情况进行了优化,但显然不是...但是您可以轻松实现自己的 Skip使用此优化的方法(参见 Jon Skeet's article 关于此)

如果有 TakeUntil 实际上会更优雅方法...我们可以很容易地创建它:

public static IEnumerable<TSource> TakeUntil<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
foreach(var item in source)
{
if (predicate(item))
break;
yield return item;
}
}

使用这个方法,代码变成:

var a = someList.TakeUntil(CheckCondition).ToList();
var b = someList.Skip(a.Count).ToList();

关于c# - 使用 linq 拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4610856/

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