C# 按顺序找到第一个
我有一个数字列表,我想返回序列中第一个数字的列表 所以这个列表{1,2,5,7,8,9} 我想返回{1,5,7} 1因为1,2是一个序列,1是序列中的第一个 5因为它不在一个序列中 7因为7,8,9是一个序列,7是其中的第一个C# 按顺序找到第一个,c#,linq,C#,Linq,我有一个数字列表,我想返回序列中第一个数字的列表 所以这个列表{1,2,5,7,8,9} 我想返回{1,5,7} 1因为1,2是一个序列,1是序列中的第一个 5因为它不在一个序列中 7因为7,8,9是一个序列,7是其中的第一个 我在想,如果我循环通过它们,并检查列表中是否有一个数字在循环中的电流之前,我可以确定这一点,但我想知道我是否可以用linq做到这一点?这正是你想要的: int[] data = { 1, 2, 5, 7, 8, 9 }; var result = data.Aggrega
我在想,如果我循环通过它们,并检查列表中是否有一个数字在循环中的电流之前,我可以确定这一点,但我想知道我是否可以用linq做到这一点?这正是你想要的:
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));
}
对于我个人的学习,我尝试了一下,并得出了一个成功的结果,但是其他答案看起来更好,可能更有效。无论如何,我是这样做的:
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
这对我很有用:
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;
我没有考虑太多,但是您可能可以使用LINQ聚合方法来实现您的目标。但首先你应该尝试一下。解释你尝试了什么,发生了什么,以及这与你想要的有什么不同。展示你的作品。如果我在结果{Console.WriteLinelist.Min;}中将最后一个foreach更改为foreach List,请参见“是”,这将起作用