c# – 使用Linq将数据分区为数组
发布时间:2020-12-15 18:04:13 所属栏目:百科 来源:网络整理
导读:我有一个元素数组,其中元素具有Flagged布尔值. 1 flagged2 not flagged3 not flagged4 flagged5 not flagged6 not flagged7 not flagged8 flagged9 not flagged 我想根据标记的指标将其分解为数组 输出 array 1 {1,2,3}array 2 {4,5,6,7}array 3 {8,9} 解决
我有一个元素数组,其中元素具有Flagged布尔值.
1 flagged 2 not flagged 3 not flagged 4 flagged 5 not flagged 6 not flagged 7 not flagged 8 flagged 9 not flagged 我想根据标记的指标将其分解为数组 输出> array 1 {1,2,3} array 2 {4,5,6,7} array 3 {8,9} 解决方法
Linq没有这方面的操作符,但我编写了一个你可以使用的扩展方法(在提交到
MoreLinq的过程中,你也应该检查):
使用下面的运算符,你会写: var result = items.Segment( (item,prevItem,idx) => item.Flagged ) .Select( seq => seq.ToArray() ) // converts each sequence to an array .ToList(); 这是扩展方法的代码: public static IEnumerable<IEnumerable<T>> Segment<T>(IEnumerable<T> sequence,Func<T,T,int,bool> newSegmentIdentifier) { var index = -1; using (var iter = sequence.GetEnumerator()) { var segment = new List<T>(); var prevItem = default(T); // ensure that the first item is always part // of the first segment. This is an intentional // behavior. Segmentation always begins with // the second element in the sequence. if (iter.MoveNext()) { ++index; segment.Add(iter.Current); prevItem = iter.Current; } while (iter.MoveNext()) { ++index; // check if the item represents the start of a new segment var isNewSegment = newSegmentIdentifier(iter.Current,index); prevItem = iter.Current; if (!isNewSegment) { // if not a new segment,append and continue segment.Add(iter.Current); continue; } yield return segment; // yield the completed segment // start a new segment... segment = new List<T> { iter.Current }; } // handle the case of the sequence ending before new segment is detected if (segment.Count > 0) yield return segment; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |