[英]GroupBy dynamic list on multiple properties by using reflection
我有一个 class 定义了一些设置,其中一个设置是对要分组的列表进行分组的属性:
object 的 class 我的设置
MySetting setting = new()
{
Groupby = $"{nameof(MyCss.Color)}, {nameof(MyCss.Width)}",
//.....
}
现在我有一个动态列表,我想将此列表作为参数发送给 ApplySetting 之类的方法, setting
为ApplySetting
,此方法必须检查Groupby
是否不是 null 并将我的列表分组:
public ApplySetting(List<TItem> myList, MySetting setting)
{
if(setting.Groupby != null)
{
var arr = setting.Groupby.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList();
//do some this like, this wrong !
var groubs = myList.GroupBy(x => arr.ForEach(y => GetPropertyValue(y, x, x.GetType())))
}
}
注意: GetPropertyValue
是一种使用反射从 object 中获取值的方法。
谢谢你的帮助。
这不是您要求的反思解决方案,而是破解,但也许它可以为您服务。 它使用 lib System.Linq.Dynamic.Core 并将列表转换为可查询。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
public class MySetting {
public string Groupby {get; set;}
}
public class ToGroupType{
public string Color {get; set;}
public string Width {get; set;}
}
public class Program
{
public static void Main()
{
MySetting setting = new()
{
Groupby = $"Color, Width",
//.....
};
static void ApplySetting<TItem>(List<TItem> myList, MySetting setting)
{
if(setting.Groupby != null)
{
//do some this like, this wrong !
var groubs = myList.AsQueryable().GroupBy($"new ({setting.Groupby})", "it").Select($"new (it.Key as Key , Count() as Count)").ToDynamicList();
Console.WriteLine(string.Join(",", groubs));
//result: Key = { Color = Red, Width = 10 }, Count = 2 },{ Key = { Color = Blue, Width = 10 }, Count = 2 },{ Key = { Color = Blue, Width = 15 }, Count = 1 }
}
}
ApplySetting(new List<ToGroupType>(){
new ToGroupType{Color = "Red", Width="10"},
new ToGroupType{Color = "Red", Width="10"},
new ToGroupType{Color = "Blue", Width="10"},
new ToGroupType{Color = "Blue", Width="10"},
new ToGroupType{Color = "Blue", Width="15"},
}, setting);
}}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.