3

我想归档类似于 Pythons 的 groupby 的行为。

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

2 回答 2

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

于 2012-07-20T14:46:33.637 回答
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

于 2012-07-20T15:05:49.593 回答