Linq выберите новый объект
У меня есть запрос linq
var x = (from t in types select t).GroupBy(g =>g.Type)
который группирует объекты по их типу, в результате я хочу иметь единственный новый объект, содержащий все сгруппированные объекты и их счет. Что-то вроде этого:
type1, 30
type2, 43
type3, 72
чтобы быть более ясным: результаты группировки должны быть в одном объекте, а не в объекте по типу элемента
Ответы
Ответ 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)]);