【问题标题】:Remove items from list 1 not in list 2从列表 1 中删除不在列表 2 中的项目
【发布时间】:2010-11-01 01:33:31
【问题描述】:

我正在学习写 lambda expressions,我需要有关如何从一个列表中删除不在另一个列表中的所有元素的帮助。

var list = new List<int> {1, 2, 2, 4, 5};
var list2 = new List<int> { 4, 5 };

// Remove all list items not in List2
// new List Should contain {4,5}    
// The lambda expression is the Predicate.
list.RemoveAll(item => item. /*solution expression here*/ );

// Display results.
foreach (int i in list)
{
    Console.WriteLine(i);
}

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    您可以通过 RemoveAll 使用 Contains 来做到这一点:

    list.RemoveAll( item => !list2.Contains(item));
    

    或者,如果您只想要交叉点,使用Enumerable.Intersect 会更有效:

    list = list.Intersect(list2).ToList();
    

    不同之处在于,在后一种情况下,您不会得到重复的条目。例如,如果 list2 包含 2,则在第一种情况下,您将得到 {2,2,4,5},在第二种情况下,您将得到 {2,4,5}

    【讨论】:

    • 如果您比较对象而不是标量,请查看我对这个答案的改进(如下)
    【解决方案2】:

    对象的解决方案(可能比 horaces 解决方案更容易):

    如果您的列表包含对象,而不是标量,就这么简单,只需删除对象的一个选定属性

        var a = allActivePatientContracts.RemoveAll(x => !allPatients.Select(y => y.Id).Contains(x.PatientId));
    

    【讨论】:

    • 伟大而简单的解决方案,我想做与 OP 相同的事情,但想使用对象。这解决了它!
    【解决方案3】:

    此问题已标记为已回答,但有一个问题。如果您的列表包含一个对象,而不是一个标量,您需要做更多的工作。

    我用 Remove() 和 RemoveAt() 以及各种各样的东西一遍又一遍地尝试了这个,但没有一个能正常工作。我什至无法让 Contains() 正常工作。从来没有匹配过任何东西。我被难住了,直到我怀疑它可能无法正确匹配项目。

    当我意识到这一点时,我重构了 item 类来实现 IEquatable,然后它就开始工作了。

    这是我的解决方案:

    class GenericLookupE : IEquatable<GenericLookupE>
    {
        public string   ID  { get; set; }
    
        public bool     Equals( GenericLookupE other )
        {
            if ( this.ID == other.ID )      return true;
    
            return false;
        }
    }
    

    在我这样做之后,Reed Copsey 的上述 RemoveAll() 答案对我来说非常有效。

    见:http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx

    【讨论】:

      【解决方案4】:
      list = list.Except(list2).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-20
        • 1970-01-01
        • 2016-05-08
        • 2011-03-18
        • 2013-01-17
        • 2021-07-19
        相关资源
        最近更新 更多