我有两个不同自定义类型的列表。两种类型共享2个共同属性。
例如:
List<foo>;
List<bar>;
它们都具有属性,例如名为Name和Age。
我想返回一个包含所有bar对象的新List,其中bar的Name和Age属性出现在任何foo对象中。 最好的方法是什么?
由于
答案 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
。