在序列中找到第一个#

时间:2014-12-15 04:21:56

标签: c# linq

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

所以这个清单{1,2,5,7,8,9}

我想返回{1,5,7}

1,因为1,2是一个序列,1是其中的第一个#

5因为它不在序列中

7因为7,8,9是序列而7是第一个#。

我在想,如果我循环通过它们并检查列表中是否有一个数字在循环中的当前#之前我可以确定这个,但我想知道我是否可以用linq做到这一点?

3 个答案:

答案 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;