C# 在两个列表之间查找公共对象列表
我有一个类的对象列表,例如:C# 在两个列表之间查找公共对象列表,c#,linq,C#,Linq,我有一个类的对象列表,例如: class MyClass { string id, string name, string lastname } 例如:List myClassList 我还有一些ID的字符串列表,例如: List<string> myIdList; 列出myIdList; 现在,我正在寻找一种方法,该方法接受这两个参数,并返回对象的列表,这些对象的id与myIdList中的相同 注意:总是较大的列表是myClassList,总是myIdL
class MyClass
{
string id,
string name,
string lastname
}
例如:List myClassList代码>
我还有一些ID的字符串列表,例如:
List<string> myIdList;
列出myIdList;
现在,我正在寻找一种方法,该方法接受这两个参数,并返回对象的列表,这些对象的id
与myIdList
中的相同
注意:总是较大的列表是myClassList
,总是myIdList
是较小的子集。
我们如何找到这个交叉点?您必须使用下面提到的代码
var samedata=myClassList.where(p=>p.myIdList.Any(q=>q==p.id))
您必须使用下面提到的代码
var samedata=myClassList.where(p=>p.myIdList.Any(q=>q==p.id))
您可以在两个列表之间使用联接:
return myClassList.Join(
myIdList,
item => item.Id,
id => id,
(item, id) => item)
.ToList();
您可以在两个列表之间使用联接:
return myClassList.Join(
myIdList,
item => item.Id,
id => id,
(item, id) => item)
.ToList();
那么您正在查找myClassList
中的所有元素,其中myIdList
包含ID?这表明:
var query = myClassList.Where(c => myIdList.Contains(c.id));
请注意,如果您可以使用哈希集
而不是列表
,则每个包含的
测试可能会更有效-当然,如果您的ID列表变大了。(如果ID列表很小,很可能根本没有什么区别。)
重要的是要考虑一个连接和上面的方法在复制代码中的区别,无论是在<代码> MyCaseList还是<代码> MyIdList。一个连接将产生每一个匹配的对-在myClassList
中,上面的每个项将产生0或1个元素
你想要哪一个取决于你自己
编辑:如果您正在与数据库交谈,最好不要首先对实体使用列表
,除非您需要它们用于其他用途,在数据库中执行查询要比获取所有数据然后在本地执行查询明智得多。那么您要查找myClassList
中的所有元素,其中myIdList
包含ID?这表明:
var query = myClassList.Where(c => myIdList.Contains(c.id));
myClassList.Where(x => myIdList.Contains(x.id));
请注意,如果您可以使用哈希集
而不是列表
,则每个包含的
测试可能会更有效-当然,如果您的ID列表变大了。(如果ID列表很小,很可能根本没有什么区别。)
重要的是要考虑一个连接和上面的方法在复制代码中的区别,无论是在<代码> MyCaseList还是<代码> MyIdList。一个连接将产生每一个匹配的对-在myClassList
中,上面的每个项将产生0或1个元素
你想要哪一个取决于你自己
编辑:如果您正在与数据库交谈,最好不要首先对实体使用列表
——除非您需要它们用于其他用途,否则在数据库中执行查询比获取所有数据然后在本地执行查询更为明智。这并不是严格意义上的交叉点(除非ID是唯一的),但您可以简单地使用Contains
,即
myClassList.Where(x => myIdList.Contains(x.id));
var sublist = myClassList.Where(x => myIdList.Contains(x.id));
但是,如果您首先创建哈希集
,您将获得显著更好的性能:
var hash = new HashSet<string>(myIdList);
var sublist = myClassList.Where(x => hash.Contains(x.id));
var hash=newhashset(myIdList);
var sublist=myClassList.Where(x=>hash.Contains(x.id));
这不是严格意义上的交叉点(除非ID是唯一的),但您可以简单地使用包含,即
var sublist = myClassList.Where(x => myIdList.Contains(x.id));
但是,如果您首先创建哈希集
,您将获得显著更好的性能:
var hash = new HashSet<string>(myIdList);
var sublist = myClassList.Where(x => hash.Contains(x.id));
var hash=newhashset(myIdList);
var sublist=myClassList.Where(x=>hash.Contains(x.id));
这是两个列表之间的一种交叉点,所以请阅读它,就像我想从第二个列表中的一个列表中得到什么一样。这里ToList()部分同时执行查询
var lst = myClassList.Where(x => myIdList.Contains(x.id)).ToList();
这是两个列表之间的交叉点,所以读它就像我想从第二个列表中的一个列表中得到什么一样
var lst = myClassList.Where(x => myIdList.Contains(x.id)).ToList();
试一试
List GetMatchingObjects(List classList,List idList)
{
返回classList.Where(myClass=>idList.Any(x=>myClass.id==x)).ToList();
}
试试看
List GetMatchingObjects(List classList,List idList)
{
返回classList.Where(myClass=>idList.Any(x=>myClass.id==x)).ToList();
}
这会在引擎盖下创建一个哈希表吗?只是好奇它在性能方面与其他选项相比如何…@Chris,我不知道具体的实现,但是的,我相信它使用了哈希集(或类似的东西)在某个时候。你可以在这里查看实现:这会在引擎盖下创建一个哈希表吗?只是好奇它与其他性能选项相比如何…@Chris,我不知道确切的实现,但是的,我相信它使用了哈希集(或类似的东西)在某种程度上,您可以在这里查看实现:连接是完成此操作的自然方式;您可以使用哈希集获得方法的性能优势,而不需要MyIdleist作为Hashset@ThomasLevesque我不同意这一点-连接有不同的语义(重复)。一个“包含”更自然地映射到这里的规范,IMO。谢谢,先生,所以我有一个EF对象,它返回数据库中所有教师的列表,然后我有一些教师ID的列表,我想有一个教师对象列表,但不是全部,他们的ID在该ID列表中。@devwanabe:好的,那么您在翻译我的答案(或任何其他答案)中的代码时遇到了什么困难在应用程序中?请注意,最好是在数据库中进行查询,而不是首先提取整个教师组。@DevWannaBe:这完全取决于细节-如果您有一个非常小的数据集,那么将其全部缓存在内存中可能是有意义的-但是如果您要求(比如)1000万个元素中有10个元素,那么你就不想获取所有1000万个元素了