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

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

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

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

type1, 30    
type2, 43    
type3, 72

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

Ответы на вопрос(6)

необходимом для создания новых объектов из запроса LINQ.

Но если присваивания для заполнения полей объекта представляют собой нечто большее, чем простые присваивания, например, синтаксический анализ строк для целых чисел, и одно из них завершается неудачно, это невозможно отладить. Вы не можете создать точку останова ни на одном из отдельных назначений.

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

Так вместо:

var query2 = from c in doc.Descendants("SuggestionItem")
                select new SuggestionItem
                       { Phrase = c.Element("Phrase").Value
                         Blocked = bool.Parse(c.Element("Blocked").Value),
                         SeenCount = int.Parse(c.Element("SeenCount").Value)
                       };

Ил

var query2 = from c in doc.Descendants("SuggestionItem")
                         select new SuggestionItem(c);

Я вместо этого сделал это:

List<SuggestionItem> retList = new List<SuggestionItem>();

var query = from c in doc.Descendants("SuggestionItem") select c;

foreach (XElement item in query)
{
    SuggestionItem anItem = new SuggestionItem(item);
    retList.Add(anItem);
}

Это позволило мне легко отладить и выяснить, какое задание было неудачным. В этом случае в XElement отсутствовало поле, которое я разбирал, чтобы установить в элементе SuggestionItem.

Я столкнулся с этими проблемами с Visual Studio 2017 во время написания модульных тестов для новой библиотечной процедуры.

но в 2016 году я смог написать следующее LINQ:

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

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

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)]);

Читать : 101 LINQ Samples в этом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 объект использует 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());   

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

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());

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

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

ВАШ ОТВЕТ НА ВОПРОС