web-dev-qa-db-ja.com

Linqを使用して、文字列のリストにリスト内の文字列が含まれているかどうかを確認する方法

私は、文字列のリスト内の文字列のいずれかが含まれているDB内の文字列であることを確認するlinqクエリを構築しています。

何かのようなもの。

query = query.Where(x => x.tags
                   .Contains(--any of the items in my list of strings--));

また、リスト内のアイテムがいくつ一致したかを知りたいです。

任意の助けをいただければ幸いです。

更新:タグはリストではなく文字列であることを述べたはずです。そして、クエリが実際に実行される前に、タグに関連しない場所をさらに2つ追加します。これは、エンティティフレームワークに対して実行されています。

15
Lrayh

編集:この答えは、tagsが文字列のコレクションであると仮定しました...

あなたが望むかもしれないように聞こえます:

var list = new List<string> { ... };
var query = query.Where(x => x.tags.Any(tag => list.Contains(tag));

または:

var list = new List<string> { ... };
var query = query.Where(x => x.tags.Intersect(list).Any());

(これがLINQ to SQLまたはEFを使用している場合、1つは動作するが、もう1つは動作しないことがあります。LINQto Objectsだけで、両方が動作するはずです。)

カウントを取得するには、次のようなものが必要です。

var result = query.Select(x => new { x, count = x.tags.Count(tag => list.Contains(tag)) })
                  .Where(pair => pair.count != 0);

resultの各要素は、x(アイテム)とcount(一致するタグの数)のペアです。

16
Jon Skeet

以前にこのようなことをしたことがあります:

var myList = new List<string>();
myList.Add("One");
myList.Add("Two");

var matches = query.Where(x => myList.Any(y => x.tags.Contains(y)));
2
aleonj

このような:

List<string> list = new List<string>();
list.Add("One");
list.Add("Two");

 var result = query.Where(x => list.Contains(x.tags));
2
Ehsan Sajjad

Jon Skeetの答えが正しい場合、x.tagsが文字列またはリストであるかどうか、あなたの質問からはよくわかりません。 x.tagsは文字列の文字列ですが、正しく理解できれば。その場合の解決策は次のとおりです。

list.Any(x => x.tags.IndexOf(x) > -1)

それらを数えるために

list.Count(x => x.tags.IndexOf(x) > -1)
1
happygilmore