如何使用LINQ查找列表中下一个匹配元素的索引

本文关键字:元素 索引 下一个 何使用 LINQ 查找 列表 | 更新日期: 2023-09-27 18:01:16

我有一个列表,比如:

List<string> list = new List<string>(){"Oracle","SQL Server","Java","Oracle","Python"};

现在我正试图使用LINQ:从列表中获取第二个"Oracle"的索引

var indexFirefox = list.FindIndex(a => a.Text == "Oracle");

但这将只为您提供索引为0的第一个实例。我希望结果中的索引为4。将使用Skip帮助或有一种更简单的方法来获取索引。上面的例子只是一个演示,我有一个超过300个值的列表。

如何使用LINQ查找列表中下一个匹配元素的索引

当已经存在一个方法(在第一个注释中给出(时,许多Linq回答

CCD_ 1具有一个重载,它只从该索引中获取一个额外的索引参数进行搜索。

因此,要获得项目的第二次出现,您只需要使用该重载并得到"常规"FindIndex的结果
(注意:在您的问题示例中,您使用了a.Text,但项目是字符串,因此没有Text属性(

var firstIndex = list.FindIndex (item => item == "Oracle");
if (firstIndex != -1)
{
    var secondIndex = list.FindIndex (firstIndex, item => item == "Oracle");
    // use secondIndex (can be -1 if there is no second occurrence)
}

在您的示例中,secondIndex将是3(而不是问题中所述的4,索引为零(

或者,如果您想依次获得出现索引,您可以使用相同的方法进行循环。

// defined here to not have to repeat it 
Predicate<string> match = item => item == "Oracle";
for (var index = list.FindIndex (match); index > -1; index = list.FindIndex (index + 1, match))
{
    // use index here
}

或者如果你喜欢循环

var index = list.FindIndex (match);
while (index > -1)
{
    // use index here
    index = list.FindeIndex (index + 1, match);
}

在这里我可以找到匹配元素的下一个索引

list.Select((value, index) => new { value, index = index + 1 }).Where(x => x.value == "Oracle").Skip(1).FirstOrDefault().index

这对我来说很好:

var result =
    list
        .Select((x, n) => new { x, n })
        .Where(xn => xn.x == "Oracle")
        .Select(xn => xn.n)
        .Skip(1)
        .FirstOrDefault();

这给出了给定输入CCD_ 7的CCD_。

list.Where(x => x == "Oracle").ElementAt(1);
  • 如果没有第二个查找,将崩溃,您可以在返回第二个元素之前检查可枚举对象的大小