7

C# では、この.Splitメソッドを呼び出すと、文字列が何らかの文字または文字列に基づいて文字列の配列に分割されます。

リストまたは配列に同等の方法はありますか?

例えば:

var foo = new List<int>() { 1, 2, 3, 0, 4, 5, 0, 6 };
var output = Split(foo, 0);
// produces { { 1, 2, 3 }, { 4, 5 }, { 6 } }

これは私がこれまでに持っているものです-同じタスクを達成するためのよりクリーンで雄弁な方法はありますか?

IEnumerable<IEnumerable<T>> Split<T>(IEnumerable<T> list, T divider)
{
    var output = new List<List<T>>();
    var temp = new List<T>();
    foreach ( var item in list )
    {
        if (item.Equals(divider))
        {
            output.Add(temp);
            temp = new List<T>();
        }
        else
        {
            temp.Add(item);
        }
    }

    output.Add(temp);
    return output;
}

編集:

私のバージョンではリストを単一の要素でのみ分割するのに対しstring.Split、単一の文字または任意の文字列を使用して分割できることがわかりました。

完全を期すために、それを実装する最良の方法は何でしょうか?

4

3 に答える 3

8

組み込みの同等物はありませんが、遅延評価されたものは次のようになります

IEnumerable<IEnumerable<T>> Split<T>(IEnumerable<T> list, T divider)
{
    var temp = new List<T>();
    foreach (var item in list)
    {
        if (!item.Equals(divider))
        {
            temp.Add(item);
        }
        else
        {
            yield return temp;
            temp = new List<T>();
        }
    }

    if(temp.Count>0) yield return temp;
}
于 2013-07-18T22:43:07.540 に答える
2

いいえ、フレームワークにはシーケンスを分割するための特別な既存のメソッドはありません。

あなたのコードは合理的です。

改善/変更するルート:

  • yield returnに追加する代わりにを使用しoutputて、遅延評価を取得できる場合があります。
  • さらに興味深いコードを使用すると、内部リストを遅延させることもできます (これは、着信シーケンスがバインドされていないか、セグメントが長すぎる場合に重要になる場合があります)。
  • そして、Aggregate単一のステートメントコードを披露したい場合に使用できます...
于 2013-07-18T22:48:11.360 に答える