Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时获取和删除的Linq方法?_C#_Linq - Fatal编程技术网

C# 同时获取和删除的Linq方法?

C# 同时获取和删除的Linq方法?,c#,linq,C#,Linq,是否有一种linq方法可以同时获取和删除 假设我想将前五个元素从一个列表移动到另一个列表。我确信我可以用几个linq语句来实现这一点,但有时我发现我已经重新发明了一个已经存在的方法 现在有这样的方法吗?(如果没有,我可以去。)没有。你应该创造你自己的。我不确定在同一个动作中阅读和修改列表是否是一个好主意 没有。LINQ代表语言集成查询,其所有方法都用于导航和检查现有集合。它没有任何改变集合的方法 但是,您可以使用类的某些方法。然而,没有一种方法可以做到这一点。这里有一个最小的解决方案: list

是否有一种linq方法可以同时
获取
删除

假设我想将前五个元素从一个列表移动到另一个列表。我确信我可以用几个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
。这是更快,更容易,只是更好的周围。