Линк: Как получить второй последний - PullRequest
26 голосов
/ 04 января 2012

Итак, у меня есть список строк, который выглядит следующим образом:

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))

Я думаю, что это решение может быть сложным для этой простой задачи. Поэтому мой вопрос: есть ли у кого-нибудь из вас более простое решение этой проблемы?

Ответы [ 7 ]

36 голосов
/ 04 января 2012

Reverse хорошо подходит здесь:

ls.SelectMany(l =>l.Split('-').Reverse().Skip(1).Take(1).DefaultIfEmpty())

Я также использую SelectMany для преобразования IEnumerable<IEnumerable<string>> в <IEnumerable<string>.

12 голосов
/ 04 января 2012
        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();
7 голосов
/ 04 января 2012

Если у вас есть

var ls = new List<string>( ... );

, тогда

var result = ls.Reverse().Skip(1).Take(1);

должно работать.

6 голосов
/ 04 января 2012
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);
2 голосов
/ 07 сентября 2016

Я создал расширение на основе приведенного выше ответа Павла Гатилова

public static TSource SecondLast<TSource>(this IEnumerable<TSource> source)
{
      //from /5136212/link-kak-poluchit-vtoroi-poslednii
      return source.Reverse().Skip(1).Take(1).FirstOrDefault();
}
2 голосов
/ 04 января 2012
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];
});
0 голосов
/ 09 апреля 2014

В лямбда-синтаксисе:

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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...