3

Python の 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 に答える