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

时间:2009-12-03 00:25:57

标签: c# linq

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

实施例。该列表包含以下3个字符串:

Search a fox
APPLE
Going to school

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

5 个答案:

答案 0 :(得分:7)

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

或者:

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

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

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

此外,如果列表中没有元素,在第二个位置有“P”,则会抛出异常。如果需要,可以使用LastOrDefaultnull的测试。

答案 1 :(得分:1)

怎么样

strings.Where(o => o.Length > 1 && o[1] == 'P').Last();

答案 2 :(得分:1)

你的意思是你想要字符串的索引:

int lastIndex =
  list
  .Select((s,i) => new { Value = s, Index = i })
  .Where(o => o.Value.Length >= 2 && o.Value[1] == 'P')
  .Select(o => o.Index).Last();

或字符串本身:

string lastString = list.Where(s => s.Length >= 2 && s[1] == 'P').Last();

答案 3 :(得分:1)

使用查询语法:

int indexOfLast = (from index in Enumerable.Range(0, strings.Length -1)
                   where strings[index].Length >= 2 && strings[index][1] == 'P'
                   select index).Last();

答案 4 :(得分:1)

list.Aggregate(new {Cursor = -1, Pointer = -1}, (x, y) => new { Cursor = x.Cursor + 1, Pointer = y.Length > 1 && y[1] == 'P' ? x.Cursor + 1 : x.Pointer}).Pointer;