所以我有一个字符串列表,如下所示:
var ls=new List<string>()
{
"100",
"101-102-1002",
"105-153-1532-1532",
"105-1854-45-198",
"180-95-45-200"
};
我想得到分裂字符串的倒数第二个。所以我的输出看起来像这样:
null,
102,
1532,
45,
45
我有一个解决方案,看起来像这样:
ls.Select (l =>l.Split('-').Select ((s,i) =>new {s,i})
.OrderByDescending (x=>x.i).Skip(1).Take(1))
我认为这个解决方案对于这个简单的任务可能很复杂。所以我的问题是:你们有没有更简单的解决方案来解决这个问题?
答案 0 :(得分:36)
Reverse
非常适合:
ls.SelectMany(l =>l.Split('-').Reverse().Skip(1).Take(1).DefaultIfEmpty())
我还使用SelectMany
将IEnumerable<IEnumerable<string>>
转换为<IEnumerable<string>
。
答案 1 :(得分:12)
var ls = new List<string>() { "100", "101-102-1002", "105-153-1532-1532", "12-1235-785" };
var result = from p in ls
let arr = p.Split('-')
select arr.Length < 2 ? null : arr[arr.Length - 2];
foreach (var item in result)
{
Console.WriteLine(item);
}
Console.Read();
答案 2 :(得分:7)
如果你有
var ls = new List<string>( ... );
然后
var result = ls.Reverse().Skip(1).Take(1);
应该有用。
答案 3 :(得分:6)
var ls = new List<string>(){"100","101-102-1002","105-153-1532-1532","12-1235-785"};
var result = from l in ls
let s = l.Split('-')
select s.ElementAtOrDefault(s.Length - 2);
答案 4 :(得分:2)
var ls = new List<string> { "100", "101-102-1002", "105-153-1532-1532", "12-1235-785" };
var result = ls.Select(x =>
{
var tokens = x.Split('-');
if (tokens.Length < 2)
{
return null;
}
return tokens[tokens.Length - 2];
});
答案 5 :(得分:2)
我根据Pavel Gatilov的回答创建了一个扩展
public static TSource SecondLast<TSource>(this IEnumerable<TSource> source)
{
//from http://stackoverflow.com/questions/8724179/linq-how-to-get-second-last
return source.Reverse().Skip(1).Take(1).FirstOrDefault();
}
答案 6 :(得分:0)
在lambda语法中:
var ls = new List<string>() { "100", "101-102-1002", "105-153-1532-1532", "12-1235-785" };
var result = ls.Select(x => new { split = x.Split('-') }).Select(y => y.split.LastOrDefault(z => z != y.split.LastOrDefault()));
答案 7 :(得分:0)
我以某种方式浏览了这个页面。 Linq 的所有答案都不起作用。使用 FirstOrDefault 时,您必须指定 DefaultIfEmpty 并用值填充它。如果在运行时需要默认值,则 FirstOrDefault 本身会中断。接受的答案有 DefaultIfEmpty 但没有指定值。它不会工作,下面的例子会。
var result = ls.DefaultIfEmpty(string.Empty).Reverse().Skip(1).Take(1).FirstOrDefault();