我正在尝试将int列表与对象列表进行比较。查看其中一个ID是否与每个对象中的一个键匹配。如果是,则返回true,否则返回false。
例如:
List<int> ints = new List<int> () { 1, 2, 3, 4, 5};
List<someObjectType> objects = new List<someObjectType> () { {1, 'one'}, {6, 'six'}, {45, 'forty-five'} };
(x => x.objects.any(a => ints.contains(x.id)));
但是我不知道如何将一个int列表与一个对象上的一个属性进行比较,我只知道如何将整个数组相互比较。
答案 0 :(得分:4)
你在寻找类似的东西吗?
List<int> ints = new List<int> () { 1, 2, 3, 4, 5};
// For better performance when "ints" is long
HashSet<int> ids = new HashSet<int>(ints);
List<someObjectType> objects = new List<someObjectType> () {
{1, "one"}, {6, "six"}, {45, "forty-five"} };
// if any is matched?
boolean any = objects
.Any(item => ids.Contains(item.id));
// All that match
var objectsThatMatch = objects
.Where(item => ids.Contains(item.id));
答案 1 :(得分:1)
您的伪代码几乎就在那里(虽然使用Where
代替Any
)...
var objectsWithIds = objects.Where(o => ints.Contains(o.Id));
这让我怀疑这不是你追求的......
另一种方法是使用Intersect
,但您需要将它们转换为相同类型的IEnumerable<>
。
var intersectionOfIds = objects.Select(_ => _.Id).Intersect(ints);
但是这只能获得两个列表中的ID列表,而不是对象本身,然后您需要再次找到它们。
答案 2 :(得分:0)
您可以使用关键字dynamic
代替object
,但更好的解决方案是使用某种静态类型(如果可能)。
您可以像字典一样使用dynamic
,添加的链接会为您提供一些很好的示例。
答案 3 :(得分:0)
我很亲密
(x => x.objects.any(a => ints.contains(a.id)));