C#LINQ比较列表值

时间:2011-07-25 14:16:15

标签: c# linq

我有两个不同自定义类型的列表。两种类型共享2个共同属性。

例如:

List<foo>;
List<bar>;

它们都具有属性,例如名为Name和Age。

我想返回一个包含所有bar对象的新List,其中bar的Name和Age属性出现在任何foo对象中。 最好的方法是什么?

由于

3 个答案:

答案 0 :(得分:11)

假设共享属性正确实现了相等,您可能希望执行以下操作:

// In an extensions class somewhere. This should really be in the standard lib.
// We need it for the sake of type inference.
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> items)
{
    return new HashSet<T>(items);
}

var shared = foos.Select(foo => new { foo.SharedProperty1, foo.SharedProperty2 })
                 .ToHashSet();

var query = bars.Where(bar => shared.Contains(new { bar.SharedProperty1,
                                                    bar.SharedProperty2 }));

使用连接的其他选项肯定会有效 - 但是我发现这一点更加清晰,表达了您只希望查看每个bar条目一次,即使有多个foo项目该财产。

答案 1 :(得分:3)

听起来你需要加入:

var fooList = new List<foo>();
var barList = new List<bar>();

// fill the lists

var results = from f in fooList
              join b in barList on 
                  new { f.commonPropery1, f.commonProperty2 }
                  equals 
                  new { b.commonProperty1, commonProperty2 = b.someOtherProp }
              select new { f, b };

答案 2 :(得分:1)

Any应该有效,如果与foo匹配的数量无关:

var selectedBars = bars.Where(bar => 
                                foos.Any(foo => foo.Property1 == bar.Property1 
                                             && foo.Property2 == bar.Property2));

如果所有foos都匹配使用All

var selectedBars = bars.Where(bar => 
                                foos.All(foo => foo.Property1 == bar.Property1 
                                             && foo.Property2 == bar.Property2));

如果foos列表很大,请使用John {Skeets的答案中指出的HashSet