0

列挙が非常に長く、大きすぎてリストに合理的に変換できないと想像してください。リストから重複を削除したいとも想像してみてください。最後に、最初の列挙のごく一部だけが重複を含む可能性があることを私が知っていると想像してください。最後のポイントは問題を実用的にします。

基本的に、いくつかの述語に基づいてリストをフィルターで除外し、そのサブセットでDistinct()のみを呼び出しますが、述語がfalseを返した列挙と再結合します。

誰かがこれを行うための良い慣用的なLinqの方法を考えることができますか?質問は次のように要約されると思います。

Linqを使用して、述語列挙に対して選択的な処理を実行し、結果ストリームを述語から拒否されたケースと再結合するにはどうすればよいですか?

4

2 に答える 2

0

1 回目は述語と重複除去を適用し、2 回目は述語の否定を適用します。Where別の解決策は、一致しないエントリをサイドのバッファにプッシュする拡張メソッドの独自のバリアントを作成することです。

IEnumerable<T> WhereTee(this IEnumerable<T> input, Predicate<T> pred, List<T> buffer)
{
    foreach (T t in input)
    {
        if (pred(t))
        {
            yield return t;
        }
        else
        {
            buffer.Add(t);
        }
    }
}
于 2010-05-12T08:37:01.997 に答える
0

要素を再結合する方法についてもう少し詳しく教えてください。

この問題を解決する方法の 1 つは、このように .Net 4.0 の Zip 演算子を使用することです。

var initialList  = new List<int>();

    var resjectedElemnts = initialList.Where( x=> !aPredicate(x) );
    var accepetedElements = initialList.Where( x=> aPredicate(x) );

    var result = accepetedElements.Zip(resjectedElemnts,(accepted,rejected) => T new {accepted,rejected});

これにより、拒否された要素と受け入れられた要素のペアのリストが作成されます。ただし、リストのサイズは、2 つの入力間の短いリストによって制限されます。

于 2010-05-12T22:10:07.923 に答える