如何将项目从列表移动到C#中的另一个列表?

Sté*_*écy 26 c# linq list

将一些项目(不是全部)从一个列表转移到另一个列表的最佳方式是什么.

我正在做的是以下内容:

var selected = from item in items
               where item.something > 10
               select item;

otherList.AddRange(selected);

items.RemoveAll(item => selected.Contains(item));
Run Code Online (Sandbox Code Playgroud)

为了获得最快/最好的代码,还有更好的方法吗?

Sco*_*vey 19

我试试@ Mehrdad的答案,也许也可以对这个问题进行测试......

var selected = items.Where(item => item.Something > 10).ToList();
selected.ForEach(item => items.Remove(item));
otherList.AddRange(selected);
Run Code Online (Sandbox Code Playgroud)


Meh*_*ari 12

我建议:

var selected = items.Where(item => item.Something > 10).ToList();
items = items.Except(selected).ToList();
otherList.AddRange(selected);
Run Code Online (Sandbox Code Playgroud)


Met*_*ght 7

RemoveAll会遍历每个项目,并且每次都会枚举所选列表的所有值.这将花费更长的时间......

我要做的是将条件直接放在RemoveAll参数中:

items.RemoveAll(item => item.something > 10);
Run Code Online (Sandbox Code Playgroud)

如果你这样做并且不改变代码的其余部分则会出现代码重复,这是不好的.我会做以下事情以避免它:

Func<ItemType, bool> selectedCondition = (item => item.something > 10);

otherList.AddRange(items.Where(selectedCondition));

items.RemoveAll(new Predicate<ItemType>(selectedCondition));
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 6

这是非常糟糕的性能 - 它实际上枚举了一次查询n次(对于n个项目items).如果你构建(例如)一个HashSet<T>要操作的项目会更好.

给出一个只有int值的简单示例:

    var items = new List<int> { 1, 2, 3, 4, 5, 6 };
    var otherList = new List<int>();
    var selected = new HashSet<int>(items.Where(
        item => item > 3));
    otherList.AddRange(selected);
    items.RemoveAll(selected.Contains);
Run Code Online (Sandbox Code Playgroud)

  • "selected"是IEnumerable <>查询 - *不是*容器."selected.Contains"每次调用时都会枚举此查询. (2认同)