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

本文关键字:索引 不等于 int 的项 获取 LINQ 列表 使用 | 更新日期: 2023-09-27 17:57:44

我在List中有项目,我想获得索引不等于某个值的所有项目,

假设它是按钮List<Button>的列表。如何使用以下内容获取那些索引不是index的按钮。

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

更新:

我正试图在一行中获取<indexOfButton>。所以我假设还有另一个linq查询可以从buttonList中获取按钮索引?

最终目标是获得不包含有问题索引的List。

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

您可以在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();

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

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

buttonList.RemoveAt(index);