我有一个类的对象列表,例如:
class MyClass
{
string id,
string name,
string lastname
}
所以例如:List<MyClass> myClassList;
我也有一些id的字符串列表,例如:
List<string> myIdList;
现在我正在寻找一种方法,让一个方法接受这两个作为参数,并返回List<MyClass>
个对象,id
与{{1}中的对象相同}}
注意:总是较大的列表为myIdList
,并且始终myClassList
是其中较小的一部分。
我们怎样才能找到这个交汇点?
答案 0 :(得分:9)
所以,您希望找到myClassList
中 myIdList
包含 ID的所有元素?这表明:
var query = myClassList.Where(c => myIdList.Contains(c.id));
请注意,如果您可以使用HashSet<string>
而不是List<string>
,则每个Contains
测试可能会更有效 - 当然,如果您的ID列表变大。 (如果ID列表很小,则根本没有什么差别。)
在面对myClassList
或myIdList
中的重复元素时,考虑联接和上述方法之间的区别非常重要。连接将产生每个匹配对 - 上面将在myClassList
中为每个项目产生0或1个元素。
您想要的是哪一个。
编辑:如果您正在与数据库交谈,那么最好不要首先对实体使用List<T>
- 除非您需要其他内容,否则它将是< em>很多在数据库中进行查询比获取所有数据然后在本地执行查询更明智。
答案 1 :(得分:5)
这不是一个严格的交叉点(除非id是唯一的),但你可以简单地使用Contains
,即
var sublist = myClassList.Where(x => myIdList.Contains(x.id));
但是,如果先创建HashSet<T>
,
var hash = new HashSet<string>(myIdList);
var sublist = myClassList.Where(x => hash.Contains(x.id));
答案 2 :(得分:4)
您可以在两个列表之间使用联接:
return myClassList.Join(
myIdList,
item => item.Id,
id => id,
(item, id) => item)
.ToList();
答案 3 :(得分:2)
它是两个列表之间的交集,所以读取它就像我想从第二个列表中出现的一个列表中的东西。这里ToList()部分同时执行查询。
var lst = myClassList.Where(x => myIdList.Contains(x.id)).ToList();
答案 4 :(得分:1)
你必须使用下面提到的代码
var samedata=myClassList.where(p=>p.myIdList.Any(q=>q==p.id))
答案 5 :(得分:1)
myClassList.Where(x => myIdList.Contains(x.id));
答案 6 :(得分:1)
尝试
List<MyClass> GetMatchingObjects(List<MyClass> classList, List<string> idList)
{
return classList.Where(myClass => idList.Any(x => myClass.id == x)).ToList();
}
答案 7 :(得分:0)
var q = myClassList.Where(x => myIdList.Contains(x.id));