我有一个清单说:
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个值的列表。
答案 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}}。