Философия использования? Вот общий ответ, который вы можете применить в другом месте.
Прочитайте несколько примеров, где инструмент полезен. Если вам не хватает причины использовать этот инструмент, потому что подобные примеры для вас никогда не возникают, забудьте об этом. Это может просто не быть применимо к вашему домену.
Если все данные, которыми вы манипулируете, находятся в СУБД, то, возможно, вам вообще не нужен Linq to Objects.
С другой стороны ... может случиться так, что вы думаете об этом как о способе дополнительной манипуляции с данными из базы данных, и, таким образом, упускаете возможности усилить выразительность вашего кода, который не имеет ничего общего с делать с базой данных.
Пример: вы читаете файл, состоящий из строк простого текста.
var lines = File.ReadAllLines(fileName);
Как оказалось, lines
теперь содержит массив строк, но массивы поддерживают IEnumerable, поэтому мы можем использовать методы Linq для них. Предположим, вы хотите удалить строки, в которых ничего нет:
var nonBlankLines = lines.Where(line => line.Trim() == string.Empty);
И предположим, что вы хотели, чтобы эти строки были в кавычках (наивная реализация - нужно экранировать существующие кавычки!):
var quoted = lines.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"");
(Мне нравится выстраивать последовательные операции с точечным методом, выровненным друг под другом.)
И если я не собираюсь делать что-то еще со строками, я бы сделал это:
var quoted = File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"");
А затем предположим, что я хочу, чтобы все это было превращено в одну строку, разделенную запятыми, в строке есть метод с именем Join
, который может это сделать, если сначала превратить все в массив:
var quoted = string.Join(", ",
File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"")
.ToArray());
Или мы можем использовать способ Linqy:
var quoted = File.ReadAllLines(fileName)
.Where(line => line.Trim() == string.Empty)
.Select(line => "\"" + line + "\"")
.Aggregate((a, b) => a + ", " + b);
Также нет ничего сложного в заполнении нескольких пробелов, когда вы обнаружите, что для того, что вам нужно, нет существующего оператора (хотя иногда он уже есть). Один большой, который отсутствует, - это противоположность Aggregate
, которую я назвал Util.Generate
:
IEnumerable<T> Generate<T>(T item, Func<T, T> generator)
{
for (; item != null; item = generator(item))
yield return item;
}
Это очень удобно, когда у вас есть связанный список, который иногда появляется в объектных моделях. Примером является Exception.InnerException
, который позволяет исключениям формировать связанный список с самым внутренним в конце. Предположим, мы хотим отобразить сообщение только из самого внутреннего исключения x
:
MessageBox.Show(Util.Generate(x, i => i.InnerException).Last().Message);
Вспомогательный метод Generate
преобразует связанный список в IEnumerable, позволяя другим методам Linq работать с ним. Ему просто нужно дать лямбду, чтобы сказать, как перейти к следующему элементу из текущего.
Может быть, это поможет вам начать, или, может быть, вам нужно больше примеров, или, может быть, вы буквально никогда не манипулируете данными, не полученными из СУРБД.