使用LINQ或Lambda从列表中删除实例?

现在我来了一个阶段,将所有数据作为缓存(对象)中的一个列表,我要做的下一件事就是从列表中删除一些实例。

通常情况下,我会这样删除:

List<T> list;
List<T2> toBeRemovedItems;
// populate two lists
foreach(T2 item in toBeRemovedItems)
{
    list.Remove(delegate(T one) { 
        // build a condition based on item
        // return true or false
    });
}

更具体地说,我实际上构建或填充了动态类(不是正式定义的类)的BeRemvoedItems列表。 例如,T类与MyClass类似,删除的代码是:

class MyClass<C> {
    public string Value1 { get; set; }
    public int Value2 { get; set; }
    public C ObjectC { get; set; }
}
....
List<MyClass<C>> list;
// populate list
// populate toBeRemovedItems. Here is an example of hard-coded codes:
var toBeRemovedLItems = new[] {
    new { Value1="a", Value2 = 1},
    new { Value2="x", Value2 = 10},
    ...
};
// toBeRemovedItems may be the result of Select from a collection
foreach(var item in toBeRemovedLItems)
{
    list.Remove(delegate(MyClass one) {
        return one.Value1 = item.Value1 && one.Value2 < item.Value2;
    });
}

我尝试在MSDN的IEnumerable接口中搜索Remove()方法,但是我找不到Remove()方法(它有意义, IEnumerable仅用于枚举)。 在List类中,有几个重载的Remove(...)方法。 我不确定是否有其他方法通过使用LINQ或Lambda表达式从列表中删除项目?

顺便说一下,我想了一种方法来对列表执行查询,以获取Where条件的子集或新的IEnumerable列表,类似于从列表中移动项目。 但是,我更喜欢从我的缓存列表中删除项目,并且在某些情况下,我无法将类中的列表属性重置为新列表(例如专用集)。


你可以使用RemoveAll方法:

MyClass one; //initialize MyClass
list.RemoveAll(item => one.Value1 == item.Value1 && one.Value2 < item.Value2);

您可以使用LINQ的Where方法来过滤不应该成为列表一部分的值。 结果是删除了元素的IEnumerable<T>

var res = list.Where(item => !(one.Value1 == item.Value1 && one.Value2 < item.Value2));

这不会更新原始的List<T>实例,而是会创建一个新的IEnumerable<T> ,并删除这些值。


如果我正确地得到问题,从两个列表中产生一个唯一的集合。

为此,您可以使用以下内容

列表list1; 列表list2;

列表list3 = list1.Except(list2)

list3将包含独特的项目。

链接地址: http://www.djcxy.com/p/51365.html

上一篇: Remove instances from a list by using LINQ or Lambda?

下一篇: What is the Efficiency and Performance of LINQ and Lambda Expression in .Net?