c# – 使用linq拆分列表

c# – 使用linq拆分列表,第1张

概述我有以下代码: 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; 我有以下代码:
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)

这看起来很丑陋基本上,遍历列表并将元素添加到一个列表中,直到某些条件启动,并将其余的添加到另一个列表.

有没有更好的方法,例如使用linq? 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拆分列表全部内容,希望文章能够帮你解决c# – 使用linq拆分列表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1263333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存