Подтвердить что ты не робот

Ваши избранные запросы LINQ-to-Objects

С LINQ многие проблемы программирования могут быть решены более легко - и в меньшем количестве строк кода.

Каковы некоторые лучшие реальные запросы LINQ to-Objects, которые вы написали?

(Лучшее = простота и элегантность по сравнению с С# 2.0/императивный подход).

4b9b3361

Ответ 1

Отфильтруйте нулевые элементы в списке.

var nonnull = somelist.Where(a => a != null);

Создайте словарь, в котором ключ является значением свойства, а значение - количество раз, когда это свойство появляется в списке.

var countDictionary = somelist
    .GroupBy(a => a.SomeProperty)
    .ToDictionary(g => g.Key, g => g.Count());

Ответ 2

LINQ - это просто добавление некоторых концепций функционального программирования в С#/VB. Следовательно, да, большинство вещей, как правило, намного легче. На С# 2.0 действительно было что-то из этого - например, см. Методы List. (Хотя анонимный синтаксис метода в С# 2.0 был слишком подробным.)

Вот небольшой пример:

static readonly string badChars = "[email protected]#$%^&*()";
bool IsUserNameValid(string userName) {
  return userName.Intersect(badChars).Any();
}

Ответ 3

Пример 1

Возвращает список с именами всех доступных экземпляров SQL Server в локальной сети

private List<string> GetServerNames()
{
    return SqlDataSourceEnumerator.Instance.GetDataSources().Rows.
        Cast<DataRow>().
        Select
        (
            row => row["ServerName"].ToString() + 
                  (row["InstanceName"] != DBNull.Value ? "\\" + row["InstanceName"].ToString() : "") + 
                  (row["Version"] != DBNull.Value ? " (" + row["Version"].ToString().Substring(0, 3) + ")" : "")
        ).
        OrderBy(s => s).
        ToList();
}

Пример 2

Создает неиспользуемое имя для нового файла

private string NewName(string newNamePrefix, List<string> existingFileNames)
{
    return newNamePrefix + 
        (existingFileNames.
            Select
            (
                n =>
                {
                    if (n.StartsWith(newNamePrefix))
                    {
                        int i;
                        if (int.TryParse(n.Replace(newNamePrefix, ""), out i))
                            return i;
                    }

                    return 0;
                }
            ).
            OrderBy(i => i).
            Last() + 1
        );
}

Ответ 4

У меня есть два довольно абсурдных, но изящных примера, которые мне нравятся

public static IEnumerable<bool> Information(this byte x)
{
    return Enumerable.Range(0, 8).Select(i => ((x >> i) & 1) == 1);
}

public static IEnumerable<bool> Information(this IEnumerable<byte> xs)
{
    return xs.SelectMany(Information);
}

Хотя они инкапсулируются как операторы запросов, поэтому вы можете их повторно использовать, например. для двоичного разбора

var n = bytes.Information().Skip(3).Take(16).ToInt();

Ответ 5

Если у вас есть строка с разделителями Name=Value, например "ID=2;Name=James;Age=32;", и вы хотите быстро ее перевести в словарь, вы можете использовать:

var dict = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries)
    .Select(str => str.Split('='))
    .ToDictionary(pair => pair[0], pair => pair[1]);

Ответ 6

Если у вас есть список (т.е. List<Palette> palettes), который содержит объекты, которые содержат другой список (т.е. Palette.Colors), и хотите сгладить все эти под-списки в один:

List<Color> allColors = palettes.SelectMany(p => p.Colors);

Ответ 7

Я начал меня, и это было потрясающе!

var myList = from list in myObjectList select list

Ответ 8

Мне нравится использовать LINQ для текста при портировании кода:

Например:

String.Join("\n", @"some VB6 code
    that I could refactor automatically
    if FindAndReplace were a bit more powerfully
    And I don't want to refactor by hand".Split('\n').Trim().Select(line =>
    {
        if(line.Contains("FindAndReplace") && !line.StartsWith("//"))
        {
            return line.Split(" ").Last();
        }
        else
        {
            return String.Join("_", line.Split(" ").Take(3));
        }
    });

Вы получаете идею. Linq позволяет мне применить всю мощь преобразования С# к тексту. Обычно я использую его, когда у меня есть код на одном языке, который я хочу извлечь и манипулировать сложным образом, я бросаю текст в LinqPad и делаю "нахождение-замену" на кавычки, заменяя их двойными кавычками, затем Я окружаю его @"..." и приступаю к работе. Обычно я могу сделать массовые преобразования кода за 30 секунд или около того.

Ответ 9

Моим любимым является следующий пример Linq для динамической сортировки таблицы SQL из базы данных Northwind:

void Main()
{

// Demonstrates dynamic ordering

var SortExpression = "Total"; // choose ProductName or Total
var sortAscending = true; // choose true for ascending, false for descending

// the query to sort
var data = (from pd in Products
                    join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct
                    select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList();

// the data source you can use for data binding                     
var ds= (sortAscending) 
    ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null))
    : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null));

ds.Dump();
}

Он позволяет динамически сортировать, просто указывая поле в переменной SortExpression и порядок сортировки в переменной sortAscending.

Используя .Take(x) и .Skip(y), вы можете легко реализовать подкачку.