C# 从列表中删除元素

C# 从列表中删除元素,c#,list,C#,List,我有一个列表,我想从中删除一些元素 我遇到的问题是,若我想删除多个元素,那个么我将无法控制要删除的内容 看,代码'mylist.Removeat(index)做得很好,但是,如果我有一个列表,比如说10个元素,我需要随机删除6个,我似乎找不到一个函数可以一次删除所有元素,相反,它会删除第一个元素,然后是第二个元素,依此类推,这并不是我真正想要的 谢谢 编辑: 谢谢大家的评论,最好的方法是这样做循环下降: int img_count = img.Count;

我有一个列表,我想从中删除一些元素

我遇到的问题是,若我想删除多个元素,那个么我将无法控制要删除的内容

看,代码'mylist.Removeat(index)做得很好,但是,如果我有一个列表,比如说10个元素,我需要随机删除6个,我似乎找不到一个函数可以一次删除所有元素,相反,它会删除第一个元素,然后是第二个元素,依此类推,这并不是我真正想要的

谢谢

编辑:

谢谢大家的评论,最好的方法是这样做循环下降:

            int img_count = img.Count;

            for (int i = img_count; i >0; --i)
            {
                if (images_to_delete.Contains(i)) img.RemoveAt(i);
            }
public void RemoveMultiple<T>(List<T> list, params int[] indexes)
{
   // if this next line gives you a compiler error, you need to include
   // linq by putting a "using System.Linq;" at the very top of the file.
   var sortedIndexes = indexes.OrderByDescending(i => i);
   foreach(var indexToRemove in sortedIndexes)
   {
      list.RemoveAt(indexToRemove);
   }
}

问题并不十分清楚,但是如果您想从列表中随机删除指定数量的元素,这里有一个方法可以做到这一点。(这是一个字符串对象列表的示例,但您当然可以将其更改为使用任何对象)

private static List strList=new List();
静态void Main(字符串[]参数)
{
strList.AddRange(“A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z”)。拆分(“,”);
从列表中删除并省略ems(strList,8);
WriteLine(String.Join(“,”,strList.ToArray());
Console.ReadLine();
}
私有静态void removeandominemsfromlist(列表列表,int numToRemove){
Random randGenerator=新的Random();
如果(numToRemove>=list.Count()){
WriteLine(“要删除的数值等于或大于列表大小,正在清除列表”);
list.Clear();
返回;
}
对于(int i=0;i
当我运行它时,我得到了输出: B、 C,F,H,I,J,K,M,N,O,P,Q,R,U,V,X,Y,Z

当然,它通常会有所不同,因为它会删除随机项。

问题并不十分清楚,但是如果您想从列表中删除随机索引中指定数量的元素,这里有一个方法可以做到这一点。(这是一个字符串对象列表的示例,但您当然可以将其更改为使用任何对象)

private static List strList=new List();
静态void Main(字符串[]参数)
{
strList.AddRange(“A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z”)。拆分(“,”);
从列表中删除并省略ems(strList,8);
WriteLine(String.Join(“,”,strList.ToArray());
Console.ReadLine();
}
私有静态void removeandominemsfromlist(列表列表,int numToRemove){
Random randGenerator=新的Random();
如果(numToRemove>=list.Count()){
WriteLine(“要删除的数值等于或大于列表大小,正在清除列表”);
list.Clear();
返回;
}
对于(int i=0;i
当我运行它时,我得到了输出: B、 C,F,H,I,J,K,M,N,O,P,Q,R,U,V,X,Y,Z

当然,它通常会有所不同,因为它会删除随机项。

我认为您的问题是,一旦您删除某个索引中的某个项,所有其他索引都会移动。例如,如果您有一个
{“a”、“b”、“c”}
数组,并且希望通过传入
索引=[0,1]
来删除
a
b
。一旦调用
removeAt(0)
,现在“b”位于索引0处

处理它的一种方法是注意到只有更高的索引才会移位。因此,如果你删除第5个元素,例如,0-4仍将具有相同的含义;只有5岁及以上的儿童受到影响

因此,您可以按降序(从高到低)删除索引!例如:

var vals = new[]{ "a", "b", "c" };
RemoveMultiple(vals, 0, 1);
然后RemoveMultiple如下所示:

            int img_count = img.Count;

            for (int i = img_count; i >0; --i)
            {
                if (images_to_delete.Contains(i)) img.RemoveAt(i);
            }
public void RemoveMultiple<T>(List<T> list, params int[] indexes)
{
   // if this next line gives you a compiler error, you need to include
   // linq by putting a "using System.Linq;" at the very top of the file.
   var sortedIndexes = indexes.OrderByDescending(i => i);
   foreach(var indexToRemove in sortedIndexes)
   {
      list.RemoveAt(indexToRemove);
   }
}
public void RemoveMultiple(列表,参数int[]索引)
{
//如果下一行给您一个编译器错误,您需要包括
//通过在文件的最顶端放置一个“using System.linq;”。
var sortedIndex=索引.OrderByDescending(i=>i);
foreach(分类索引中的var indexToRemove)
{
list.removet(indexToRemove);
}
}

那应该行

我认为您的问题在于,一旦您删除某个索引中的某个项目,所有其他索引都会发生移动。例如,如果您有一个
{“a”、“b”、“c”}
数组,并且希望通过传入
索引=[0,1]
来删除
a
b
。一旦调用
removeAt(0)
,现在“b”位于索引0处

处理它的一种方法是注意到只有更高的索引才会移位。因此,如果你删除第5个元素,例如,0-4仍将具有相同的含义;只有5岁及以上的儿童受到影响

因此,您可以按降序(从高到低)删除索引!例如:

var vals = new[]{ "a", "b", "c" };
RemoveMultiple(vals, 0, 1);
然后RemoveMultiple如下所示:

            int img_count = img.Count;

            for (int i = img_count; i >0; --i)
            {
                if (images_to_delete.Contains(i)) img.RemoveAt(i);
            }
public void RemoveMultiple<T>(List<T> list, params int[] indexes)
{
   // if this next line gives you a compiler error, you need to include
   // linq by putting a "using System.Linq;" at the very top of the file.
   var sortedIndexes = indexes.OrderByDescending(i => i);
   foreach(var indexToRemove in sortedIndexes)
   {
      list.RemoveAt(indexToRemove);
   }
}
public void RemoveMultiple(列表,参数int[]索引)
{
//如果下一行给您一个编译器错误,您需要包括
//通过在文件的最顶端放置一个“using System.linq;”。
var sortedIndex=索引.OrderByDescending(i=>i);
foreach(分类索引中的var indexToRemove)
{
list.removet(indexToRemove);
}
}

那应该行

只要他们被移除了,怎么做才重要?为什么这不是你想要的?我的猜测是,它首先删除了最低的索引,改变了索引顺序,然后把它搞砸了。您是否尝试创建第二个要删除的项目列表并执行“除外”操作?是否有需要同时删除所有项目的原因?代码为“删除X随机元素”