将一些项目(不是全部)从一个列表转移到另一个列表的最佳方式是什么.
我正在做的是以下内容:
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)
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)
这是非常糟糕的性能 - 它实际上枚举了一次查询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)
归档时间: |
|
查看次数: |
25855 次 |
最近记录: |