c# - 使用 Linq 将数据分区到数组中

标签 c# linq

我有一个元素数组,其中元素有一个 Flagged bool 值。

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, prevItem, 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; 
         } 
     } 

关于c# - 使用 Linq 将数据分区到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603436/

相关文章:

c# - 在带有 Entity Framework 的 ViewModel 上使用 DependencyProperty

c# - IEnumerable 与 IQueryable

Linq 到实体 : how to handle null values in database with a contains

c# - 在 Nhibernate QueryOver 中使用计算属性(未映射)

c# - IsFinite() 等效

c# - 如果您被迫使用 Anemic 域模型,您将业务逻辑和计算字段放在哪里?

c# - 如何在运行时向菜单添加菜单项

c# - 从 IList<> 中选择一个随机元素而不是这个元素

c# - MVC 批量编辑 - Linq to Sql 列表保存

c# - 检查字符串列表是否包含任何枚举字符串值