listRef の少なくとも 1 つの要素が listA に複数回存在するかどうかを知りたいですか? 他の値は複数回存在する可能性があります。
List<string> listA = new List<string> { "A", "A", "B", "C", "D", "E" };
List<string> listRef = new List<string> { "B", "D" };
ありがとう、
これを試して:
bool hasRef = listref.Any(r => listA.Count(a => a == r) > 1);
ToLookup
メソッドを使用しLookup<string, string>
て最初に生成し、次にそれを使用して状態を確認します。
var lookup = listA.ToLookup(x => x);
return listRef.Any(x => lookup.Contains(x) && lookup[x].Count() > 1);
GroupBy
と を使用しToDictionary
て同じことを達成できます。
var groups = listA.GroupBy(x => x).ToDictionary(g => g.Key, g => g.Count());
return listRef.Any(x => groups.ContainsKey(x) && groups[x] > 1);
このようなもの
var query = listRef.Where(x=>
listA.Where(a => a == x)
.Skip(1)
.Any());
listRef.ForEach(refEl => {
var count = listA.Count(aEl => aEl == refEl);
if(count > 1) {
//Do something
}
});
var result = listA.GroupBy(x=>x)
.Where(g=>g.Count()>1&&listRef.Contains(g.Key))
.Select(x=>x.First());
bool a = result.Any();
2 番目のリストが大きく、重複を含めることができる場合は、HashSet<string>
andを使用して重複の可能性があり、2 番目のリストから最初のリストにないものIntersectWith
を削除します。strings
var refSet = new HashSet<string>(listRef);
refSet.IntersectWith(listA);
bool anyMoreThanOne = refSet.Any(rs => listA.ContainsMoreThanOnce(rs, StringComparison.OrdinalIgnoreCase));
ここでは、あまりエレガントではありませんが機能する拡張機能を示します。
public static bool ContainsMoreThanOnce(this IEnumerable<string> coll, String value, StringComparison comparer)
{
if (coll == null) throw new ArgumentNullException("col");
bool contains = false;
foreach (string str in coll)
{
if (String.Compare(value, str, comparer) == 0)
{
if (contains)
return true;
else
contains = true;
}
}
return false;
}
ただし、2番目listRef
が大きくないか、重複が含まれていない場合は、次を使用できます。
bool anyMoreThanOne = listRef
.Any(rs => listA.ContainsMoreThanOnce(rs, StringComparison.OrdinalIgnoreCase));
これは動作します
List<string> listA = new List<string> { "A", "A", "B", "C", "D", "E" };
List<string> listRef = new List<string> { "A", "D" };
foreach (var item in listRef)
{
if (listA.Where(x => x.Equals(item)).Count() > 1)
{
//item is present more than once
}
}