如果Linq Group由其他键分隔,则不使用相同的键合并分组

时间:2012-07-20 14:24:04

标签: linq group-by

我想实现类似于Python的行为。

[1, 1, 2, 1].GroupBy() => [[1, 1], [2], [1]]

2 个答案:

答案 0 :(得分:1)

我认为这就是你要找的东西:

var data = new int[] { 1, 1, 2, 1 };
var results = Enumerable.Range(0, data.Count ())
    .Where (i => i == 0 || data.ElementAt(i - 1) != data.ElementAt(i))
    .Select (i => new
                  {
                  //Key = data.ElementAt(i),
                  Group = Enumerable.Repeat(
                     data.ElementAt(i), 
                     data.Skip(i).TakeWhile (d => d == data.ElementAt(i)).Count ())
                  }
             );

以下是其运行示例和结果:http://ideone.com/NJGQB

答案 1 :(得分:1)

这是一个懒惰的通用扩展方法,可以满足您的需求。


<强>代码:

public static IEnumerable<IEnumerable<T>> MyGroupBy<T>(this IEnumerable<T> source)
{
    using(var enumerator = source.GetEnumerator())
    {
        var currentgroup = new List<T>();
        while (enumerator.MoveNext())
        {
            if (!currentgroup.Any() || currentgroup[0].Equals(enumerator.Current))
                currentgroup.Add(enumerator.Current);
            else
            {
                yield return currentgroup.AsReadOnly();                 
                currentgroup = new List<T>() { enumerator.Current };
            }
        }
        yield return currentgroup.AsReadOnly();
    }
}

<强>测试

void Main()
{
    var data = new int[] { 1, 1, 2, 1 };

    foreach(var g in data.MyGroupBy())
        Console.WriteLine(String.Join(", ", g));
}

<强>输出:

  

1,1   2
  1