如何从带有 where 子句的列表中获取数据到另一个列表?

Posted

技术标签:

【中文标题】如何从带有 where 子句的列表中获取数据到另一个列表?【英文标题】:How can I get data from a list with a where clause to another list? 【发布时间】:2010-10-04 01:55:29 【问题描述】:

我有一个包含多个类的列表,其中包含一个整数 (Id) 属性。

我也有一个整数列表。

现在,我想将我的对象列表修剪为仅具有整数列表中的属性的那些类。

例子:

List of MyObject
[MyObjectA].Id = 1
[MyObjectB].Id = 2
[MyObjectC].Id = 3
[MyObjectD].Id = 4

List of Integer
1
2

Final list should be 
[MyObjectA]
[MyObjectB]

我该怎么做?

【问题讨论】:

【参考方案1】:

你可以使用包含:

var finalList = originalList.Where(x => idList.Contains(x.Id)).ToList();

或加入:

var finalList = (from entry in originalList
                join id in idList on entry.Id equals id
                select entry).ToList();

【讨论】:

您的意思是 entry.Id 而不是 x.Id? (在使用连接的情况下) 我最喜欢解决方案 1。连接很好,但我更喜欢第一个的可读性。 @shahkalpesh:已修复,谢谢。 @Longhorn213:如果 idList 最终变得非常大,第二个会明显更快。它基本上构建了一个哈希映射,而不是对每个条目进行线性扫描。【参考方案2】:

怎么样:

list.RemoveAll(x => list2.IndexOf(x.Id) >= 0);

【讨论】:

【参考方案3】:

应该这样做:

// Assume objList is IEnumerable<MyObject> and intList is IEnumerable<int>.
IEnumerable<MyObject> intersection =
  from obj in objList
    join i in intList on obj.Id equals i
  select obj

请注意,如果多个对象具有相同的 id,或者该 id 在列表中多次列出并且一个对象与之对应,则该对象将在结果列表中出现多次。

我认为该组更适合较大的列表,因为其他一些解决方案会多次遍历列表以搜索相应的对象。

【讨论】:

【参考方案4】:

或者,如果您有两个列表,每个列表都有属性,试试这个:

List<someObj1> firstList ... //assume this has items
List<otherObj2> secondList ... //assume this has items
var finalList = firstList.Where(so1 => secondList.Select(oo2 => oo2.Prop1).Contains(so1.Prop1) && so1.Prop2 == "foo");

//Prop1 is a property of the someObj1 and otherObj objects. 
//Prop2 is a property of the someObj1 object.

【讨论】:

以上是关于如何从带有 where 子句的列表中获取数据到另一个列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 select 语句的 where 子句中使用比较运算符?

带有获取下一行的 Where 子句

MySQL:使用带有 WHERE 子句的 JOINS 从一个表中获取所有记录并从另一个表中获取可用记录

如何在 WHERE 子句中编写带有 SELECT 语句的 SQL DELETE 语句?

如何从 Firestore 7.24.0 实例中查询具有多个 where 子句的数据?

如何使用带有 PySpark 的 WHERE 子句在 AWS Glue 中查询 JDBC 数据库?