Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按顺序找到第一个_C#_Linq - Fatal编程技术网

C# 按顺序找到第一个

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

我有一个数字列表,我想返回序列中第一个数字的列表

所以这个列表{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.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,请参见“是”,这将起作用