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

时间:2016-08-07 21:40:42

标签: c# linq

我有一个清单说:

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个值的列表。

4 个答案:

答案 0 :(得分:5)

当有一个方法完成这项工作时(在第一条评论中给出)

,Linq回答了这么多

List<T>.FindIndex有一个overload,它只需要从该索引中搜索一个额外的索引参数。

因此,要获得第二次出现的项目,您只需要使用该过载,并使用&#34;常规&#34; 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
}

或者如果你喜欢while循环

var index = list.FindIndex (match);

while (index > -1)
{
    // use index here

    index = list.FindeIndex (index + 1, match);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这对我很好:

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

这给出了输入3的{​​{1}}。