Group by and count on list lambda c#



我在数据库中有2个表DepartmentSubDepartment。每个部门可以有或不能有多个子部门。我正在从这两个表中获取数据,以以下类的形式组合。

这个类在两个表中都有更多的属性

public class Department
{
public int DepartmentId { get; set; } 
public string DepartmentName { get; set; } 
public int SubDepartmentId { get; set; } 
public string SubDepartmentName { get; set; } 
}

例如,数据可以是DepartmentScience它将有多个子部门物理化学,。也可以用英文它将有一个子部门作为英语

现在,从从DB中获取的List of Departments collection形式的数据中,我必须提取那些有多个子部门的部门。

代码如下:

List<Department> departments = new List<Department>();
// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments .GroupBy(x => x.DepartmentId)
.Where(x => x.Count() > 1)
.Select(x => new { DepartmentId = x.Key }).ToList();
// Here getting the entire data/item for each dept and subdept
var finalDeptData = departments.Where(x => multidepartmentIds.Any(y => y.DepartmentId == x.DepartmentId)).ToList();

有没有更好的方法来实现这个?

我还想到了一种方法,在Count之后的单个lambda语句中,我们可以拥有具有所有类属性的匿名类型,但问题是我必须将此集合返回给调用方方法,然后在这种情况下,我必须将匿名集合返回为类型对象,这将需要更改调用方方法。

帮忙吗? ?

看看你的代码,在我看来,你正试图获得所有子部门的列表,他们的部门有多个子部门。在本例中,您可以这样做:

List<Department> departments = new List<Department>();
// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments
.GroupBy(x => x.DepartmentId)
.Where(x => x.Count() > 1)
.SelectMany(x => x)
.ToList();

不需要创建一个匿名类型来保存单个值。由于您正在查找id集合中的匹配项,因此请使用HashSet来保存它们:

// Here fetching deptids which are having multi sub deptids
var multidepartmentIds = departments.GroupBy(d => d.DepartmentId)
.Where(dg => dg.Count() > 1)
.Select(dg => dg.Key)
.ToHashSet();
// Here getting the entire data/item for each dept and subdept
var finalDeptData = departments.Where(d => multidepartmentIds.Contains(d.DepartmentId)).ToList();

但是,由于您真正想要的是出现多次的所有departments,因此您可以在一条语句中完成:

// find all departments with multiple sub deptids and return them
var finalDeptData2 = departments.GroupBy(d => d.DepartmentId)
.Where(dg => dg.Count() > 1)
.SelectMany(dg => dg)
.ToList();

我想有一个扩展方法:

public static class IEnumerableExt {
public static IEnumerable<T> DuplicatesBy<T,TKey>(this IEnumerable<T> src, Func<T,TKey> keyFn, IEqualityComparer<TKey> comparer = null)
=> src.GroupBy(s => keyFn(s), comparer).Where(sg => sg.Count() > 1).SelectMany(sg => sg);
}

可以这样使用:

var findDeptData3 = departments.DuplicatesBy(d => d.DepartmentId).ToList();

最新更新