我在列表中有一个字符串列表。如何使用LINQ获取列表中最后一个字符串,该字符串在字符串的第二个位置具有字符“P”。我想在使用LINQ的单个语句中执行此操作,而不是在传统循环中进行搜索。
实施例。该列表包含以下3个字符串:
Search a fox
APPLE
Going to school
LINQ语句应返回2,这是列表中符合条件的第二个字符串。
答案 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”,则会抛出异常。如果需要,可以使用LastOrDefault
和null
的测试。
答案 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;