collection
を特定の条件に一致するアイテムに分割したいと思います。TakeWhileとSkipWhileをパーティションコレクションに結合する
public static bool IsNotSeparator(int value) => value != 3;
var collection = new [] { 1, 2, 3, 4, 5 };
var part1 = collection.TakeWhile(IsNotSeparator);
var part2 = collection.SkipWhile(IsNotSeparator);
をしかし、これは二回collection
の開始から繰り返すだろうとIsNotSeparator
が長くかかる場合、それはパフォーマンスの問題になる可能性があります:私は理解するのは簡単である、TakeWhile
とSkipWhile
を使用していることを行うことができます。
より高速な方法は次のようなものを使用することです:
var part1 = new List<int>();
var index = 0;
for (var max = collection.Length; index < max; ++index) {
if (IsNotSeparator(collection[i]))
part1.Add(collection[i]);
else
break;
}
var part2 = collection.Skip(index);
しかし、それは最初の例よりも本当に少なく、より読みやすいです。
私の質問は:collection
を特定の要素に分割する最良の解決策は何ですか?
私は上記のこれら二つを組み合わせることですが、どう:
var collection = new [] { 1, 2, 3, 4, 5 };
var part1 = collection.TakeWhile(IsNotSeparator).ToList();
var part2 = collection.Skip(part1.Count);
これはむしろ主張されている質問です。 "ベストソリューション"は何を構成していますか?読みやすさ?コードのサイズ?速度?メモリ使用量? – Groo
@Groo私は可読性のために行くだろう。しかし、 'IsNotSeparator'が長くかかると性能上問題になるかもしれません。 –
リストはソートされていますか?これはパフォーマンスの最大の違いになります。また、 'Stringのように動作するように一般化すれば。「IEnumerable> Split(this IEnumerable list、Predicate match) 'などの拡張メソッドを作成できます。これは、指定された項目で区切られたチャンクをいくつでも返します。 –
Groo