按运行时已知的多个键分组用户在查看数据时可以根据自己的喜好对列进行分组。我正在编写一个将此数据导出到Excel文档的函数,并希望保留用户在页面上的分组。我能够获取按用户分组的对象属性的字符串名称。我坚持的是如何在运行时进行分组。有很多这样的例子:使用lambda对多个列进行分组描述了如何在编译时提前知道如何按多个属性进行分组。但是,我不知道在运行时要分组什么。有关于如何在运行时进行分组的建议吗?到这一点例如:usingSystem;使用System.Collections.Generic;使用System.Linq;使用System.Linq.Dynamic;//必须通过nuget安装或下载publicclassPerson{publicstringFirstName{get;放;}publicstringLastName{get;放;}publicDateTimeDOB{get;放;}}classProgram{staticvoidMain(string[]args){varpeeps=newList{newPerson(){FirstName="Tim",LastName="Smith",DOB=DateTime.Now},newPerson(){FirstName="Tim",LastName="Smith",DOB=DateTime.Now.AddDays(1)},newPerson(){FirstName="Mike",LastName="Smith",DOB=DateTime.Now.AddDays(2)},newPerson(){FirstName="Frank",LastName="Jones",DOB=DateTime.Now.AddDays(3)},};vareq=peeps.GroupBy("new(LastName,FirstName)","it").Select("new(it.KeyasKey,itasPeople)");;foreach(eq中的动态el){Console.WriteLine(el.钥匙);foreach(varpersoninel.PeopleasIEnumerable){Console.WriteLine(person.LastName+""+person.DOB);您可能正在寻找此类问题的答案,特别是:varmyData=gridData.AsEnumerable().GroupBy(r=>r,newMyDataComparer(keys)).ToList();内部类MyDataComparer:IEqualityComparer{privatereadonlystring[]_keys;publicMyDataComparer(string[]keys){_keys=keys;//保留要比较的键。}publicboolEquals(MyDataTypex,MyDataTypey){//检查所有必需字段是否匹配的简单实现。这可能需要更多的工作。boolareEqual=true;foreach(varkeyin_keys){areEqual&=(x[key].Equals(y[key]));}返回相等;}publicintGetHashCode(DataRowobj){//在此处添加实现以创建聚合哈希码。您正在尝试按您在运行时拥有的特定属性的名称进行分组,这与此类似,只是它固定为2个过滤器。这只是您的另一种选择。使用linqpad进行测试。filter的数量是固定的还是动态的?voidMain(){varmySchool=newList{newSchool{Student="StudentA",Teacher="TeacherA",Subject="Math",Grades=80},newSchool{Student="StudentB",Teacher="TeacherA",Subject="Math",Grades=65},newSchool{Student="StudentC",Teacher="TeacherA",Subject="Math",Grades=95},newSchool{Student=“StudentA”,Teacher=“TeacherB”,Subject=“History”,Grades=80},newSchool{Student=“StudentB”,Teacher=“TeacherB”,Subject="History",Grades=100},newSchool{Student="StudentA",Teacher="TeacherC",Subject="English",Grades=100},newSchool{Student="StudentC",老师="B老师",Subject="English",Grades=100},newSchool{Student="StudentD",Teacher="B老师",Subject="English",Grades=90},};GroupByFilters("老师","主题",mySchool);GroupByFilters("主题","老师",mySchool);}publicvoidGroupByFilters(stringfilter1,stringfilter2,Listschool){PropertyInfoprop1=typeof(School).GetProperties().Where(x=>x.Name==filter1).First();PropertyInfoprop2=typeof(School).GetProperties().Where(x=>x.Name==filter2).First();vargrouping=fromsinschoolgroupsbynew{filter1=prop1.GetValue(s),filter2=prop2.GetValue(s)}intogrselectnew{Filter1=gr.Key.filter1,Filter2=gr.Key.filter2,TotalGrades=gr.Sum(x=>x.Grades),Count=gr.Count(),Average=gr.Average(x=>x.Grades)};分组.Dump();//Linqpadspecific}//在这里定义其他方法和类;set;}}Filter1Filter2TotalGradesCountA老师平均数学240380TeacherB历史180290TeacherC英语1001100TeacherB英语190295Filter1Filter2TotalGradesCount平均数学老师A240380历史老师B180290英语老师C1001100英语老师B190295以上是C#学习教程:根据运行时已知的多个key分组分享的全部内容。有用,需要多了解C#学习教程,希望大家多多关注~本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
