簡體   English   中英

按動態屬性值按列表對象分組c#

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

有人可以幫助我嗎?

您不需要自己創建表達式。 解決該問題的一種方法是將您要嘗試的操作分成兩部分:

  1. 獲取所有聯系人類型。
  2. 根據每種聯系人類型以及在該類型下列出了所有聯系人的所有人員來創建字典。

可以使用以下代碼完成此操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM