2012-09-20 77 views
3

我有下面的列表以及如何使用LINQ删除指定索引号的所有元素:删除所有元素,除了从给定的索引号

List<string> a = new List<string>(); 
     a.Add("number1"); 
     a.Add("number2"); 
     a.Add("number3"); 

如何删除所有元素只是除了元件,其索引号= 2使用linq。

+0

可能的复制[C# - 列表 - 删除所有的元素,但不是前四个(http://stackoverflow.com/questions/ 10531284/c-sharp-list-remove-all-elements-but-not-the-first-4) – iceDragon

回答

9

LINQ是不是删除的东西 - 这是关于查询

您可以致电RemoveRange从列表中删除一系列项目。所以:

a.RemoveRange(0, 2); 

只会留下“number3”。

或者您可以根据dasblinkenlight的答案创建一个新列表。如果您可以告诉我们更多关于您想要实现的目标以及为什么您认为LINQ是解决方案,我们可能会为您提供更多帮助。

编辑:好的,现在我们有了更清晰的要求,你可以使用LINQ:

var newList = a.Where((value, index) => index != 2) 
       .ToList(); 
+0

好sablinkenlights答案是我寻找的,我正在寻找简单的方法。我正在考虑选择索引号不相等的元素。例如:我不想选择索引号为2的元素,我想选择索引号为1和3的元素。但是你是对的,linq不是关于删除。 –

+3

@MichaelRiva:所以你不*实际试图从列表中删除元素?你正在创建一个新的列表?清楚这些事情很重要。而且这听起来像你试图滤除元素2,而不是过滤掉所有*但是元素2?你很*不清楚...... –

+0

+1乔恩处理OP的_clarity_。 :) –

2

“除X以外的所有东西”的等效操作是“保留X”。最简单的方式做到这一点是在指数2用一个单一的元素构建一个新的列表,像这样:

a = new List<string>{a[2]}; 
+0

呃我怎么会这么认为 –

3

假设你有你想保留,您可以使用Whereindex过滤索引列表:

var indexList = new[] {2}; 
var result = a.Where((s, index) => indexList.Contains(index)); 
+0

哇很好的回答 –

+0

var result = a.Where((s,index)=> index == 2);'更简单,但你需要在任何一个之后添加“ToList()”的调用。 – dasblinkenlight

2

虽然@ dasblinkenlight的答案是更好的选择,这里是LINQ(或至少一个迭代)

a.Where((item,index) => b1 == 2); 

或返回单个字符串对象,而不是的IEnumberable

a.Where((a1,b1) => b1 == 2).First();