我有一個物件串列。物件包含另一個串列。我想在C#中基于內部串列執行group by。
我正在使用下面的代碼,但它沒有作業。
class Abc
{
public int id { get; set; }
public List<xyz> courselist { get; set; }
}
class xyz; }
{
public string course { get; set; }
public void PerformGroupBy
{
List<Abc> projects = new List<Abc>()。
var prj1 = new Abc();
prj1.id = 100;
prj1.courselist = new List<xyz> ();
prj1.courselist.Add(new xyz { course = "imr101" }) 。
prj1.courselist.Add(new xyz { course = "imr102" }) 。
projects.Add(prj1);
var prj2 = new Abc()。
prj2.id = 101;
prj2.courselist = new List<xyz> ();
prj2.courselist.Add(new xyz { course = "imr201" }) 。
prj2.courselist.Add(new xyz { course = "imr102" }) 。
projects.Add(prj2);
var prj3 = new Abc()。
prj3.id = 103;
prj3.courselist = new List<xyz> ();
prj3.courselist.Add(new xyz { course = "imr101" }) 。
prj3.courselist.Add(new xyz { course = "imr102" }) 。
projects.Add(prj3)。
var grp1= projects.GroupBy(x => x.courselist).ToList()。
//var grp2 = grp1;
預期的結果
[/span>
{
courselist: [{course: imr101},{課程。 imr102}]
ids: [101,103]
},
{>
courselist: [{course: imr201},{課程。 imr102}]
ids: [/span>102]
}
]
uj5u.com熱心網友回復:
對于按集合分組,你必須為GroupBy函式指定適當的EqualityComparer。無論如何,即使沒有這個功能,你也可以生成分組的關鍵:
var grp1 = projects。 GroupBy(x => string.Join(",", x.courselist.Select(x => x.course)
.Select(g => new)
{
courselist = g.First().courselist,
ids = g.Select(x => x.Id).ToArray()
})
.ToList()。
uj5u.com熱心網友回復:
它沒有達到預期的效果,因為在你的案例中,你需要為你的GroupBy方法提供一個IEqualityComparer。 下面是我為你的情況寫的一個方法(課程串列中的順序將被忽略,如果它很重要,只需洗掉OrderBy子句):
internal class XyzListEqualityComparer : IEqualityComparer<List<xyz> >
{
public bool Equals(List< xyz> x, List<xyz> y)。
{
var xCourses = x
.Select(subX => subX.course)
.OrderBy(course => course)。
var yCourses = y
.Select(subY => subY.course)
.OrderBy(course => course)。
return xCourses.SequenceEqual(yCourses)。
}
public int GetHashCode(List< xyz> obj)
{
int prime = 31;
int result = 1;
foreach(var item in obj.Select(course => course.course).OrderBy(course => course)
{
result = result * prime item.GetHashCode()。
}
return result;
}
}
然后,你只需要用IEqualityComparer來寫這個分組:
var grp1 = projects.GroupBy(x => x.courselist, x => x, new XyzListEqualityComparer()).ToList()。
如果你不想使用IEqualityComparer,這里有一個演算法,它可以做到這一點,并且會給你帶來你想要的準確輸出(性能不會是最好的,關于順序也是如此)。
var groupedItems = projects
.GroupBy(project => string.Join(",", project.courselist.Select(course => course.course).OrderBy(course => course))
.Select(groupedProject => new { courseList = groupedProject.First().courselist, ids = groupedProject.Select(project => project.id) }) 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310055.html
標籤:
下一篇:如何檢查字典中的重復值
