4

listRef の少なくとも 1 つの要素が listA に複数回存在するかどうかを知りたいですか? 他の値は複数回存在する可能性があります。

List<string> listA = new List<string> { "A", "A", "B", "C", "D", "E" };
List<string> listRef = new List<string> { "B", "D" };

ありがとう、

4

9 に答える 9

5

これを試して:

bool hasRef = listref.Any(r => listA.Count(a => a == r) > 1);
于 2013-09-02T09:25:56.380 に答える
5

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);
于 2013-09-02T09:28:34.800 に答える
2

このようなもの

    var query = listRef.Where(x=>
        listA.Where(a => a == x)
             .Skip(1)
             .Any());
于 2013-09-02T09:28:37.487 に答える
1
listRef.ForEach(refEl => {

   var count = listA.Count(aEl => aEl == refEl);
   if(count > 1) {

      //Do something

   }

});
于 2013-09-02T09:27:06.930 に答える
0
var result = listA.GroupBy(x=>x)
                  .Where(g=>g.Count()>1&&listRef.Contains(g.Key))
                  .Select(x=>x.First());
bool a = result.Any();
于 2013-09-02T09:34:12.020 に答える
0

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;
}

DEMO

ただし、2番目listRefが大きくないか、重複が含まれていない場合は、次を使用できます。

bool anyMoreThanOne = listRef
  .Any(rs => listA.ContainsMoreThanOnce(rs, StringComparison.OrdinalIgnoreCase));
于 2013-09-02T09:41:02.367 に答える
0

これは動作します

    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
        }
    }
于 2013-09-02T09:28:47.247 に答える