Pimp my LINQ: учебное упражнение на основе другого поста

Я решил впервые попробовать LINQ, чтобы попытаться решить этот вопрос .

Результаты моего первого похода в удивительный мир LINQ выглядели вот так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            List list = new List() 
            { 
               "fred-064528-NEEDED1", 
               "xxxx", 
               "frederic-84728957-NEEDED2", 
               "sam-028-NEEDED3", 
               "-----", 
               "another-test" 
            };

            var result =
            from s in list
            where (from c in s where c == '-' select c).Count() == 2
            select s.Substring(s.LastIndexOf("-") + 1);

            foreach (string s in result)
                Console.WriteLine(s);
            Console.WriteLine("Press Enter");
            Console.ReadLine();
        }
    }
}

Я хотел бы знать, как я могу улучшить вышеприведенное решение этого маленького надуманного примера. Меня не очень интересует, использовал ли я лучший метод проверки, или как я мог бы локализовать «Press Enter» или что-то в этом роде; Мне просто интересно использовать этот пример, чтобы узнать немного больше о LINQ.

8
задан Community 23 May 2017 в 12:27
поделиться

5 ответов

var result =
        from s in list
        where s.Count(x => x == '=') == 2
        select s.Substring(s.LastIndexOf("-") + 1);
6
ответ дан 5 December 2019 в 07:33
поделиться

Его также можно записать с использованием лямбда-выражений:

var result =
            list.Where(s => (from c in s where c == '-' select c).Count() == 2).Select(
                s => s.Substring(s.LastIndexOf("-") + 1));

Я предпочитаю лямбда-выражения синтаксису LINQ из-за интерфейса Fluent. ИМХО это более читабельно по-человечески.

4
ответ дан 5 December 2019 в 07:33
поделиться

По-моему, это довольно неплохо. Частично LINQ.

var result = String.Join("-", inputData.Split('-').Skip(2));

Если после первых двух не может быть никаких '-', то подойдет и это (не LINQ):

var result = inputData.Split('-')[2];  //If the last part is NEE-DED then only NEE is returned. And will fail on wrong input
4
ответ дан 5 December 2019 в 07:33
поделиться

Я не думаю, что это улучшение, так как он менее читабелен , но вы можете сделать все это в одну строку, используя некоторые из встроенных методов в классе List:

list.FindAll(s => s.ToCharArray().
    Where(c => c == '-').Count() ==2).
    ForEach(c => Console.WriteLine(c.Substring(c.LastIndexOf("-") + 1)));

Лично я считаю это довольно ужасным, так что это просто для интереса!

4
ответ дан 5 December 2019 в 07:33
поделиться

Я тоже большой поклонник Lambdas ...

    static void Main(string[] args)  
    {  
        Func<string, char, int> countNumberOfCharsInString = 
             (str, c) => str.Count(character => character == c);

        var list = new List<string>() 
        { "fred-064528-NEEDED1", 
           "xxxx", 
           "frederic-84728957-NEEDED2", 
           "sam-028-NEEDED3", 
           "-----", "another-test" 
        };

        list.Where(fullString => countNumberOfCharsInString(fullString,'-') == 2)
            .ToList()
            .ForEach(s => Console.WriteLine(s.Substring(s.LastIndexOf("-")+1)));

        Console.WriteLine("Press Enter");   
        Console.ReadLine();  
    } 
4
ответ дан 5 December 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: