我有一个元素数组,其中元素有一个 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/