2009-07-20 8 views
1

J'ai deux listes, une qui est un sous-ensemble de l'autre. Je voudrais terminer avec une seule collection du surensemble avec des éléments contenus dans le sous-ensemble marqué. Cela semble être le genre de chose que LINQ pourrait faire, mais je ne suis pas sûr de la syntaxe.Indicateur d'intersection de deux listes utilisant LINQ

Result: A, false 
     B, true 
     C, false 
     D, true 
     E, true 

Répondre

3
var list1 = new string[]{ "A", "B", "C", "D", "E" }; 
var list2 = new string[]{ "B", "D", "E" }; 
var result = 
from a in list1 
select new { Value = a, Has = list2.Contains(a) }; 

foreach(var item in result) { 
    Console.WriteLine(string.Format("{0}, {1}", item.Value, item.Has); 
} 
1
HashSet<char> subset = new HashSet<char>(list2) 

var query = list1 
    .Select(x => new 
    { 
    value = x, 
    subsetHas = subset.Contains(x) } 
); 
3
var list1 = new string[] {"A", "B", "C", "D", "E"}; 
var list2 = new string[] { "B", "D", "E"}; 

var query = from item1 in list1 
      join item2 in list2 on item1 equals item2 into g 
      select new { Name = item1, IsFound = g.Count() > 0}; 
+1

+1 - en particulier pour les grandes listes, une jointure sera plus efficace que la numérisation liste2 pour chaque élément. Notez que g.Any() est préféré à g.Count()> 0. – dahlbyk

0
var list1 = new[] { "A", "B", "C", "D", "E" }; 
var list2 = new[] { "B", "D", "E" }; 
var result = 
    list1.Intersect(list2) 
     .Select(el => new { el, true }) 
     .Union(list1.Except(list2) 
        .Select(el => new { el, false })); 
Questions connexes