[英]Group by a list objects by a dynamically properties values c#
我需要通過動態屬性值按列表對象分組。
我的對象是:
public class Person
{
public string Name {get;set;}
public List<Contact> Contacts {get;set;}
}
public class Contact
{
public string Type {get;set;}
public string Value {get;set;}
}
我需要按聯系人類型分組(例如:“站點”,“地址”)
我嘗試創建一個lambda表達式來表示對要在groupBy子句中使用的聯系人類型的搜索(選擇器是我的lambda表達式):
persons.GroupBy(selector).Select(
g => new GroupResult<TElement>
{
Key = g.Key,
Items = g,
SubGroups = g.GroupByMany(nextSelectors)
});
但是我無法創建此lambda表達式。 我在第二行得到一個錯誤:
“類型”實例屬性未設置為“ ConsoleApplication1.Person”類型。
如何在人員列表中表示“站點”聯系人類型?
var parameterExp = Expression.Parameter(typeof(TElement), "Contacts");
var propertyExp = Expression.Property(parameterExp, "Type");
MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var someValue = Expression.Constant("Site", typeof(string));
var containsMethodExp = Expression.Call(propertyExp, method, someValue);
Expression<Func<TElement, object>> predicate = Expression.Lambda<Func<TElement, object>>
(containsMethodExp, parameterExp);
有人可以幫助我嗎?
您不需要自己創建表達式。 解決該問題的一種方法是將您要嘗試的操作分成兩部分:
可以使用以下代碼完成此操作:
var contactTypes = persons.SelectMany(p => p.Contacts.Select(c => c.Type)).GroupBy(c => c).ToDictionary(c => c.Key);
var groupedPersons = contactTypes.ToDictionary(t => t.Key, t => persons.Where(p => p.Contacts.Any(c => c.Type == t.Key)).ToList());
groupedPersons是一個詞典,其中包含聯系人類型作為鍵,並包含該聯系人類型下的人員列表作為值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.