C#使用LINQ将ID列表与对象列表中的每个ID进行比较

时间:2015-04-30 15:11:02

标签: c# linq

我正在尝试将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列表与一个对象上的一个属性进行比较,我只知道如何将整个数组相互比较。

4 个答案:

答案 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)));