使用LINQ从列表中获取不等于int的索引项

时间:2014-04-10 02:11:38

标签: c# linq list

我有List中的项目,我希望得到索引不等于某事的所有项目,

说它是按钮List<Button>的列表。如何使用以下内容获取index以外的索引的按钮。

var buttons = buttonList.Where(b => b<indexOfbutton> != index);

更新

我想把<indexOfButton>放在一行。所以我假设有另一个linq查询从buttonList获取按钮索引?

最终目标是获取不包含相关索引的List。

2 个答案:

答案 0 :(得分:3)

您可以在lambda表达式中指定索引,因为Where方法的另一个重载需要Func<TSource, int, bool>

  

System.Func<TSource, Int32, Boolean>

     

测试条件的每个源元素的函数; 第二个   函数的参数表示源元素的索引。

var buttons = buttonList.Where((b,idx) => idx != index);

您还可以为此编写扩展方法:

public static class Extensions
{
    public static IEnumerable<T> SkipIndex<T>(this IEnumerable<T> source, int index)
    {
        int counter = 0;
        foreach (var item in source)
        {
            if (counter != index)
                yield return item;

            counter++;
        }
    }
}

并使用它:

var buttons = buttonList.SkipIndex(index).ToList();

如果你想获得带有索引的按钮:

var buttons = buttonList
              .Select((b,idx) => new { Button = b, Index = idx })
              .Where(x => x.Index != index)
              .ToList();

这将返回一个包含两个属性的匿名类型列表,其中一个是您的按钮,另一个是它的索引。

答案 1 :(得分:2)

如果我有丢弃列表(如果我不需要原始列表而只列出没有元素的列表)并且buttonList是IList<>,我会使用像

buttonList.RemoveAt(index);