C# 同时获取和删除的Linq方法?
是否有一种linq方法可以同时C# 同时获取和删除的Linq方法?,c#,linq,C#,Linq,是否有一种linq方法可以同时获取和删除 假设我想将前五个元素从一个列表移动到另一个列表。我确信我可以用几个linq语句来实现这一点,但有时我发现我已经重新发明了一个已经存在的方法 现在有这样的方法吗?(如果没有,我可以去。)没有。你应该创造你自己的。我不确定在同一个动作中阅读和修改列表是否是一个好主意 没有。LINQ代表语言集成查询,其所有方法都用于导航和检查现有集合。它没有任何改变集合的方法 但是,您可以使用类的某些方法。然而,没有一种方法可以做到这一点。这里有一个最小的解决方案: list
获取
和删除
假设我想将前五个元素从一个列表移动到另一个列表。我确信我可以用几个linq语句来实现这一点,但有时我发现我已经重新发明了一个已经存在的方法
现在有这样的方法吗?(如果没有,我可以去。)没有。你应该创造你自己的。我不确定在同一个动作中阅读和修改列表是否是一个好主意 没有。LINQ代表语言集成查询,其所有方法都用于导航和检查现有集合。它没有任何改变集合的方法 但是,您可以使用类的某些方法。然而,没有一种方法可以做到这一点。这里有一个最小的解决方案:
list1.AddRange(list2.Take(5));
list2.RemoveRange(0, 5);
但是,如果您真的愿意,可以将其包装在自定义扩展方法中:
public static class MyListExtensions {
public static IEnumerable<T> TakeAndRemove<T>(this List<T> list, int count) {
foreach(var n in list.Take(count))
yield return n;
source.RemoveRange(0, count);
}
}
list1.AddRange(list2.TakeAndRemove(5));
公共静态类MyListExtensions{
公共静态IEnumerable TakeAndRemove(此列表,int计数){
foreach(列表中的变量n.Take(计数))
收益率n;
source.RemoveRange(0,计数);
}
}
列表1.AddRange(列表2.TakeAndRemove(5));
是的,没有Linq方法,只需在一条语句中执行即可。我得到的最小解是这样的
List<string> one = new List<string>() { "1", "2", "3", "4", "5", "6", "7" };
List<string> two = new List<string>() { "1", "2", "3", "4", "5", "6", "7" };
two.AddRange(one.Take(5));
one.RemoveRange(0, 5);
List one=newlist(){“1”、“2”、“3”、“4”、“5”、“6”、“7”};
列表二=新列表{“1”、“2”、“3”、“4”、“5”、“6”、“7”};
2.添加范围(1.Take(5));
1.去除范围(0,5);
LINQ不能有这样的方法,因为它从不改变传递给它的集合。但是,您可以使用LINQ为您完成大部分工作
考虑一个例子:假设您需要从listA
中删除通过特定条件的所有项目,并将它们添加到listB
。您可以将LINQ分区listA
放入要保留的部分和要删除的部分,然后将所有删除的项添加到listB
。以下是您如何做到这一点:
// Let's say you want to remove all items with name starting in "X"
// The dictionary will contain two keys - true and false
// Items to keep will be under "true"; items to remove will be under "false"
var d = listA
.GroupBy(item => !item.Name.StartsWith("X"))
.ToDictionary(p => p.Key, p => p.ToList());
// Reassign the list of items that you keep to listA
listA = d[true];
// Add items from the list of items to be removed to listB
listB.AddRange(d[false]);
没有现成的LINQ方法可以做到这一点,但您似乎可以在say
List
的基础上构建一个。基本结构是有一个删除值的谓词,函数返回已删除的值集
static List<T> RemoveAndReturn<T>(this List<T> list, Predicate<T> predicate) {
var removed = new List<T>();
int i = 0;
while (i < list.Count) {
var current = list[i];
if (predicate(current)) {
removed.Add(current);
list.RemoveAt(i);
} else {
i++;
}
}
return removed;
}
static List RemoveAndReturn(此列表,谓词){
var removed=新列表();
int i=0;
而(i
请注意,这并不真正符合LINQ的精神,因为第一部分的执行是及时的,而不是延迟的。这对于避免意外的双重删除是必要的
使用此方法,您可以执行类似LINQ的查询,以删除和操作。但是最好叫它们fluent而不是LINQ我觉得奇怪的是,你居然想用一个LINQ语句对集合进行变异。根本没有一个LINQ语句(方法)可以删除。删除是列表上的操作,而不是IEnumerable上的操作。您不希望这样做。这相当于在枚举某个集合时修改该集合,并将导致运行时异常。您只需使用
ToLookup
即可,而不是GroupBy
后跟ToDictionary
。这是更快,更容易,只是更好的周围。