0

なんらかの理由で、これについて頭を悩ませることはできません。

クラスがあるとしましょうFoo

public class Foo
{
    public string Name {get;set;}
}

そして、それらの一般的なリストがあります。一般的なリストを検索して、文字列のリストからいずれかを含むものを選びたいと思いNameます。

だから何か

var source = GetListOfFoos();//assume a collection of Foo objects
var keywords = GetListOfKeyWords();//assume list/array of strings
var temp = new List<Foo>();
foreach(var keyword in keywords)
{
    temp.AddRange(source.Where(x => x.Name.Contains(keyword));
}

ここでのこの問題は、a) ループ (私には最適とは思えません) および b) 各オブジェクトが複数回表示される可能性があります (名前が「Rob StackOverflow」で、キーワード「Rob」とキーワード「Stackoverflow」があった場合)。 .

私は電話をかけることができると思いますが、繰り返しますDistinct()が、それは最適ではないと感じています.

私はこれに間違って取り組んでいると思います-何が間違っていますか?


4

2 に答える 2

2

ジェネリック リストを検索し、文字列のリストからいずれかを含む名前を持つものを選択したいと考えています。

かなり簡単に聞こえます:

var query = source.Where(e => keywords.Any(k => e.Name.Contains(k)));

ToList()として結果を取得するために追加しList<Foo>ます。

var temp = query.ToList();
于 2013-03-12T19:57:23.593 に答える
1

N 2ループを実行しないように、検索を高速化するためにキーワードを HashSet に入れます。

HashSet<string> keywords = new HashSet<string>(GetListOfKeyWords(), StringComparer.InvariantCultureIgnoreCase);

var query = source.Where(x => keywords.Contains(x.Name));

編集:実際、質問を読み直しましたが、間違っていました。これはキーワード全体にのみ一致し、名前にキーワードが含まれているかどうかは確認されません。より良い修正に取り組んでいます。

私は MarcinJuraszek の答えが好きですが、大文字と小文字を区別しないキーワードの一致も必要だと思うので、次のようなことを試してみます。

var query = source.Where(f => keywords.Any(k => f.Name.IndexOf(k, StringComparison.OrdinalIgnoreCase) >= 0));
于 2013-03-12T20:13:50.767 に答える