Я решил впервые попробовать 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.
var result =
from s in list
where s.Count(x => x == '=') == 2
select s.Substring(s.LastIndexOf("-") + 1);
Его также можно записать с использованием лямбда-выражений:
var result =
list.Where(s => (from c in s where c == '-' select c).Count() == 2).Select(
s => s.Substring(s.LastIndexOf("-") + 1));
Я предпочитаю лямбда-выражения синтаксису LINQ из-за интерфейса Fluent. ИМХО это более читабельно по-человечески.
По-моему, это довольно неплохо. Частично 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
Я не думаю, что это улучшение, так как он менее читабелен , но вы можете сделать все это в одну строку, используя некоторые из встроенных методов в классе List:
list.FindAll(s => s.ToCharArray().
Where(c => c == '-').Count() ==2).
ForEach(c => Console.WriteLine(c.Substring(c.LastIndexOf("-") + 1)));
Лично я считаю это довольно ужасным, так что это просто для интереса!
Я тоже большой поклонник 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();
}