リストA:
1, 2, 3, 4
リストB:
2, 5
リストAにリストBの値が含まれているかどうかを確認するにはどうすればよいですか?
たとえば、A.contains(a => a.id = B.id)のようなものですか?
パフォーマンスを気にしない場合は、次のことを試すことができます。
a.Any(item => b.Contains(item))
// or, as in the column using a method group
a.Any(b.Contains)
しかし、私はこれを最初に試します:
a.Intersect(b).Any()
Justins の 2 つのソリューションを紹介しました。a.Any(a => b.Contains(a))
最速です。
using System;
using System.Collections.Generic;
using System.Linq;
namespace AnswersOnSO
{
public class Class1
{
public static void Main(string []args)
{
// How to check if list A contains any value from list B?
// e.g. something like A.contains(a=>a.id = B.id)?
var a = new List<int> {1,2,3,4};
var b = new List<int> {2,5};
var times = 10000000;
DateTime dtAny = DateTime.Now;
for (var i = 0; i < times; i++)
{
var aContainsBElements = a.Any(b.Contains);
}
var timeAny = (DateTime.Now - dtAny).TotalSeconds;
DateTime dtIntersect = DateTime.Now;
for (var i = 0; i < times; i++)
{
var aContainsBElements = a.Intersect(b).Any();
}
var timeIntersect = (DateTime.Now - dtIntersect).TotalSeconds;
// timeAny: 1.1470656 secs
// timeIn.: 3.1431798 secs
}
}
}
Intersect
次の2つのリストを作成できます。
if (A.Intersect(B).Any())
これが関係ない場合は申し訳ありませんが、必要な場合に備えて FindAll() を使用して一致するリストを返します:
private bool IsContain(string cont)
{
List<string> ListToMatch= new List<string>() {"string1","string2"};
if (ListToMatch.ToArray().Any(cont.Contains))
{
return false;
}
else
return true;
}
そして使用法:
List<string> ListToCheck = new List<string>() {"string1","string2","string3","string4"};
List<string> FinalList = ListToCheck.FindAll(IsContain);
最後のリストには、チェック対象のリストから一致した要素 string1 および string2 のみが含まれます。簡単に int List に切り替えることができます。