Как считать дубликаты в списке с LINQ

Из спецификации Java :

Октальная цифра состоит из цифры ASCII 0, за которой следует одна или несколько цифр ASCII от 0 до 7 и может представлять собой положительное, нулевое или отрицательное целое.

blockquote>

72
задан SpoiledTechie.com 18 January 2009 в 04:45
поделиться

2 ответа

Можно использовать "группу" + "orderby". См. LINQ 101 для деталей

var list = new List<string> {"a", "b", "a", "c", "a", "b"};
var q = from x in list
        group x by x into g
        let count = g.Count()
        orderby count descending
        select new {Value = g.Key, Count = count};
foreach (var x in q)
{
    Console.WriteLine("Value: " + x.Value + " Count: " + x.Count);
}

В ответ на это сообщение (теперь удаленный):

, Если у Вас есть список некоторых пользовательских объектов тогда, необходимо использовать пользовательский компаратор или группа определенным свойством.

Также запрос не может отобразить результат. Покажите нам полный код для получения лучшей справки.

На основе Вашего последнего обновления:

у Вас есть эта строка кода:

group xx by xx into g

, Так как xx является системой пользовательского объекта, не знает, как сравнить один объект с другим. Как я уже записал, необходимо вести компилятор и обеспечить некоторое свойство, которое будет использоваться в сравнении объектов или обеспечит пользовательский компаратор. Вот пример:

Примечание, которое я использую Foo. Имя как ключ - т.е. объекты будет сгруппировано на основе значения [1 118] свойство Name .

существует одна выгода - Вы рассматриваете 2 объекта быть дубликатом на основе их имен, но что относительно идентификатора? В моем примере я просто беру идентификатор первого объекта в группе. Если Ваши объекты имеют различный Ids, это может быть проблема.

//Using extension methods
var q = list.GroupBy(x => x.Name)
            .Select(x => new {Count = x.Count(), 
                              Name = x.Key, 
                              ID = x.First().ID})
            .OrderByDescending(x => x.Count);

//Using LINQ
var q = from x in list
        group x by x.Name into g
        let count = g.Count()
        orderby count descending
        select new {Name = g.Key, Count = count, ID = g.First().ID};

foreach (var x in q)
{
    Console.WriteLine("Count: " + x.Count + " Name: " + x.Name + " ID: " + x.ID);
}
98
ответ дан Community 7 November 2019 в 08:25
поделиться

Немного более короткая цепочка методов использования версии:

var list = new List<string> {"a", "b", "a", "c", "a", "b"};
var q = list.GroupBy(x => x)
            .Select(g => new {Value = g.Key, Count = g.Count()})
            .OrderByDescending(x=>x.Count);

foreach (var x in q)
{
    Console.WriteLine("Value: " + x.Value + " Count: " + x.Count);
}
45
ответ дан CMS 7 November 2019 в 08:25
поделиться
Другие вопросы по тегам:

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