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();
 Stato Machino23 мая 2017 г., 06:07
это круто и поучительно! Благодарность

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

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());   
 Jeff25 мая 2012 г., 09:41
Спасибо, это достаточно хорошо для меня.

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

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

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

 Jeff25 мая 2012 г., 10:05
Это немного отличается от того, что я ожидал, но, поскольку у меня есть словарь, он достаточно хорош для решения моей проблемы. Большое спасибо за помощ
 Jon Skeet25 мая 2012 г., 10:00
@ Джефф: Так тыделат хочешь словарь? (Это все еще не совсем понятно ...) Если вам нужен словарь, это нормально - см. Мое редактирование, где более простой способ построения этого словаря, чем принятый ответ.
 Jeff25 мая 2012 г., 09:51
Хорошо, я знаю, какие типы я буду искать в сгруппированном списке, поэтому, кажется, достаточно просто поместить его в словарь, чтобы создать объект вне запрос
 Jeff25 мая 2012 г., 09:34
Извините за неясный вопрос. Ваше решение очень похоже на то, что мне нужно, но я хочу, чтобы все результаты группировки были в одном объекте, а не в объекте по типу
 Jon Skeet25 мая 2012 г., 09:42
@ Джефф: Ответ, который вы приняли, практически такой же, как мой ... только в словаре. Результатыявляютс все в одном объекте query). До сих пор неясно, чего вы хотите добиться, но мое решение для вас не подходит. Если вы собираетесь группировать по типу, выест иметь по одному объекту на группу, но здесьquery - это запрос, который будетдайт вы все эти группы.
var x = from t in types
        group t by t.Type into grouped
        select new { type = grouped.Key,
                     count = grouped.Count() };
 daryal17 июн. 2013 г., 08:43
@ DanyKhalife вам не нужно вызывать updateChanges, когда вы используете операторы select. Если вы используете, он ничего не вставит, он просто выполнит оператор выбора в Б
 Dany Khalife13 июн. 2013 г., 17:58
side question: вообще, если вы делаете select new {..}, он вставляет что-то в БД при обновлении Changes?

Ваш ответ на вопрос