我有一个数字列表,我想在序列中返回第一个#的#列表。
所以这个清单{1,2,5,7,8,9}
我想返回{1,5,7}
1,因为1,2是一个序列,1是其中的第一个#
5因为它不在序列中
7因为7,8,9是序列而7是第一个#。
我在想,如果我循环通过它们并检查列表中是否有一个数字在循环中的当前#之前我可以确定这个,但我想知道我是否可以用linq做到这一点?
答案 0 :(得分:2)
这就是你似乎要求的:
int[] data = { 1, 2, 5, 7, 8, 9 };
var result = data.Aggregate(new List<List<int>>(), (list, item) =>
{
List<int> previousList = list.Count > 0 ? list[list.Count - 1] : null;
if (previousList != null && item == previousList[previousList.Count - 1] + 1)
{
previousList.Add(item);
}
else
{
list.Add(new List<int> { item });
}
return list;
});
foreach (List<int> list in result)
{
Console.WriteLine("Sequence: " + string.Join(", ", list));
}
答案 1 :(得分:0)
对于我个人的学习,我有一个成功的结果,但是其他答案看起来更好,可能更有效率。无论如何,这就是我所做的:
List<int> myInts = new List<int>{ 1, 2, 5, 7, 8, 9 }.OrderBy(x => x).ToList();
List<List<int>> Sequences = new List<List<int>>();
foreach(var i in myInts)
{
var seq = Sequences.Where(x => x.Contains(i - 1));
if (seq.Count() > 0)
seq.First().Add(i);
else
Sequences.Add(new List<int> { i });
}
var firstItems = Sequences.Select(x => x.First()).ToList();
//Result: 1, 5, 7
答案 2 :(得分:0)
这对我有用:
var query =
list
.Skip(1)
.Aggregate(new
{
results = list.Take(1).ToList(),
last = list.First()
}, (a, x) =>
{
if (x > a.last + 1)
{
a.results.Add(x);
}
return new { a.results, last = x };
}).results;