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

Linq выберите новый объект

У меня есть запрос linq

var x = (from t in types select t).GroupBy(g =>g.Type)

который группирует объекты по их типу, в результате я хочу иметь единственный новый объект, содержащий все сгруппированные объекты и их счет. Что-то вроде этого:

type1, 30    
type2, 43    
type3, 72

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

4b9b3361

Ответ 1

Прочтите: 101 образец LINQ в этом LINQ - Группировка операторов из Сайт Microsoft MSDN

var x = from t in types  group t by t.Type
         into grp    
         select new { type = grp.key, count = grp.Count() };

forsingle object использует stringbuilder и добавляет его, что будет делать или преобразовывать это в виде словаря

    // fordictionary 
  var x = (from t in types  group t by t.Type
     into grp    
     select new { type = grp.key, count = grp.Count() })
   .ToDictionary( t => t.type, t => t.count); 

   //for stringbuilder not sure for this 
  var x = from t in types  group t by t.Type
         into grp    
         select new { type = grp.key, count = grp.Count() };
  StringBuilder MyStringBuilder = new StringBuilder();

  foreach (var res in x)
  {
       //: is separator between to object
       MyStringBuilder.Append(result.Type +" , "+ result.Count + " : ");
  }
  Console.WriteLine(MyStringBuilder.ToString());   

Ответ 2

Все сгруппированные объекты или все типы? Похоже, вы просто хотите:

var query = types.GroupBy(t => t.Type)
                 .Select(g => new { Type = g.Key, Count = g.Count() });

foreach (var result in query)
{
    Console.WriteLine("{0}, {1}", result.Type, result.Count);
}

EDIT: если вы хотите его в словаре, вы можете просто использовать:

var query = types.GroupBy(t => t.Type)
                 .ToDictionary(g => g.Key, g => g.Count());

Нет необходимости выбирать пары, а затем создавать словарь.

Ответ 3

Ответы здесь меня закрыли, но в 2016 году я смог написать следующий LINQ:

List<ObjectType> objectList = similarTypeList.Select(o =>
    new ObjectType
    {
        PropertyOne = o.PropertyOne,
        PropertyTwo = o.PropertyTwo,
        PropertyThree = o.PropertyThree
    }).ToList();

Ответ 4

var x = from t in types
        group t by t.Type into grouped
        select new { type = grouped.Key,
                     count = grouped.Count() };

Ответ 5

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

var types = new[] {typeof(string), typeof(string), typeof(int)};
var x = types
        .GroupBy(type => type)
        .ToDictionary(g => g.Key, g => g.Count());
foreach (var kvp in x) {
    Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value);
}
Console.WriteLine("string has a count of {0}", x[typeof(string)]);