如何使用LINQ获取列表<string>中的最后一个字符串,其中字符串'P'在字符串的第二个位置?

Ton*_*ich 2 c# linq

我在列表中有一个字符串列表.如何使用LINQ获取列表中最后一个字符串,该字符串在字符串的第二个位置具有字符"P".我想在使用LINQ的单个语句中执行此操作,而不是在传统循环中进行搜索.

例.该列表包含以下3个字符串:

Search a fox
APPLE
Going to school
Run Code Online (Sandbox Code Playgroud)

LINQ语句应返回2,这是列表中符合条件的第二个字符串.

Zoo*_*oba 7

var lastWithP = myList.Last(s => s.Length >= 2 && s[1] == 'P');
var lastIndex = myList.LastIndexOf(lastWithP);
Run Code Online (Sandbox Code Playgroud)

或者:

var lastIndex = myList.Select((s, i) => new { S = s, I = i })
                      .Last(p => p.S.Length >= 2 && p.S[1] == 'P').I;
Run Code Online (Sandbox Code Playgroud)

这两个都假设没有列表元素null,尽管它们确实检查了至少两个字符.

性能方面,基准测试是必需的,但我怀疑第一个可能更快List<string>,因为LastIndexOf()将通过引用进行比较.第二个会因为Select调用而进行更多的内存分配,但是价格昂贵IEnumerable<string>(注意并非所有的枚举都必须昂贵)只需要一个枚举.

此外,如果列表中没有元素,在第二个位置有"P",则会抛出异常.如果需要LastOrDefault,null可以使用测试.

  • @Pavel:是的,但如果效率是问题的关键,那么我们根本不会使用LINQ ...... (2认同)