0

長い文字列のリスト ( big) を取得し、他のリスト ( ) の最後の数文字を含む別のリストでフィルタリングする次の方法で問題が発生していますsmall

var big = new List<string> {
    "0000", "1111", "2222", "3333", "3333", "4444", "5555"
};

var small = new List<string> {
    "11", "22", "33", "33", "44"
};

var result = from b in big
from s in small
where b.EndsWith(s)
select b;

期待される結果は

"1111", "2222", "3333", "3333", "4444"

私が得ている結果は

"1111", "2222", "3333", "3333", "3333", "3333", "4444"

なぜそれが起こっているのかはわかりますが、それを止める方法は思いつきません。何か案は?

4

2 に答える 2

4

このクエリはデカルト積を生成するため、繰り返しが発生します。これは機能します:

var result = big.Where(b => small.Any(s => b.EndsWith(s)));

または半分のクエリ構文で:

var result = from b in big
             where small.Any(s => b.EndsWith(s))
             select b;
于 2013-10-09T14:16:24.093 に答える
1

bigあなたが何を望んでいるかを説明していないので、 の各単語に対して最初の一致を表示したいと仮定しますsmall。次のように実行できます。

var result=from s in small
           let res=big.FirstOrDefault(s=>b.EndsWith(s))
           where res!=null
           select res;

最後の一致を返したい場合は、FirstOrDefault を LastOrDefault に置き換えます。

他の方法で試合を選択したい場合は、達成したいことを説明する必要があります

于 2013-10-09T14:19:12.387 に答える