如何使用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回答
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);
- 如果没有第二个查找,将崩溃,您可以在返回第二个元素之前检查可枚举对象的大小