如何解决C#过滤器基于类属性的类列表字典
我有这本词典Dictionary<string,List<Payments>>
,其中包含雇员,每个雇员都有付款清单。 Payments类具有一个名为PayCategoryId的字符串属性。我想过滤此词典,仅获取具有某些特定PayCategoryId值的付款的员工,并且仅为每个员工提供这些付款。我非常确定这可以通过使用LINQ来实现,但是我对LINQ的经验几乎为零,因此需要您的帮助。
原始(未过滤)字典有76个项目(员工)。我将以该雇员为例,该雇员有27笔付款,其中有些具有必需的PayCategoryId。
我所做的:
- 列出所需的PayCategoryId:
var payCategoriesID = new List<string> (){ "a","b","c" };
- 使用此LINQ对字典进行半过滤(我确定这是一团糟,但是可以正常工作!):
var result = dict.Where(o => o.Value.Where(x => payCategoriesID.Contains(x.PayCategoryId)).Any()).ToDictionary(mc => mc.Key,mc => mc.Value);
- 半过滤的结果字典只有34个项目。没有使用必需的PayCategoryId付款的员工被过滤掉。但是我的示例员工列表中仍然有27笔付款。我也需要过滤他的列表,并且只使用PayCategoryId = payCategoriesID列表中的ID之一的付款。 当然,示例员工只是一个示例,所有员工都应进行过滤。
可以帮忙吗?
艾德里安
解决方法
您可以使用Select()
投影到可枚举的匿名类型中,并仅获取所需的值,然后重新构建字典。
var match = dict
.Select(kv => new
{
Employee = kv.Key,Payments = kv.Value.Where(p => payCategoriesID.Contains(p.PayCategoryId))
})
.Where(emp => emp.Payments.Any())
.ToDictionary(k => k.Employee,v => v.Payments);
第一步是创建一个具有键值和已过滤值的对象,然后Where()
删除空列表。这样,您只需要遍历id列表一次(按字典中的每个元素)。
也没有真正的联系,但是Any()
方法有一个带谓词的重载,所以代替了
o.Value.Where(x => payCategoriesID.Contains(x.PayCategoryId)).Any()
您可以直接做
o.Value.Any(x => payCategoriesID.Contains(x.PayCategoryId))
其他LINQ方法也是如此,例如Count()
,First()
,FirstOrDefault()
,Last()
等。
var result = dict.Where(o => o.Value.Where(x => payCategoriesID.Contains(x.PayCategoryId)).Any()).ToDictionary(mc => mc.Key,mc => mc.Value.Where(t=> payCategoriesID.Contains(t.PayCategoryId)));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。