如何传递不同类型的列表<;T>;转换成一种按相似字段进行分组的方法
本文关键字:相似 一种 字段 方法 列表 同类型 何传递 lt 转换 gt | 更新日期: 2023-09-27 18:29:43
我想创建一个通用方法,它将接受具有相似字段的不同类型的列表,我可以根据这些列表进行分组。
例如,我有两个列表:
- List<MemberPurchases> Purchases
- List<MemberReturns> Returns
我想要一个方法,它将接受两种不同类型的列表,然后用类似的字段对它们进行分组:(Purchases.MemberID或Returns.MemberID).
这是我所拥有的,但它不会让我在传入时对列表进行任何linq查询:
Public static int GetMemberActivity<T>(List<T> memberList)
{
var groupedList = memberList.GroupBy(x => x.
}
在这一点上,我只得到四个选项(它们都不是列表中的元素):
- Equals
- GetHashCode
- GetType
- ToString
我要找的是:
var groupedList = memberList.GroupBy(x => x.MemberID);
如何修复此问题,以便通过LINQ传入任何具有MemberID元素和组的列表。
定义一个具有类似属性的接口,然后类可以实现它:
public interface IMember
{
int MemberID { get; set; }
}
public class MemberPurchases : IMember
{
public int MemberID { get; set; }
public string SomeProperty { get; set; }
}
public class MemberReturns : IMember
{
public int MemberID { get; set; }
public string AnotherProperty { get; set; }
}
然后在你的方法中使用这个接口:
public static int GetMemberActivity(List<IMember> memberList)
{
var groupedList = memberList.GroupBy(x => x.MemberID);
return groupedList.Count(); // I'm just guessing what you want to return here
}
将列表投射到接口,然后将其传递给方法:
var result = GetMemberActivity(Purchases.ToList<IMember>());
您应该有一个公共接口,并接受该公共接口的强类型列表。
public interface IMember
{
int MemberID { get; set; }
}
public class MemberPurchases : IMember
{
public int MemberID { get; set; }
//...
}
public class MemberReturn : IMember
{
public int MemberID { get; set; }
//...
}
所以你可以有:
public static int GetMemberActivity(List<IMember> memberList)
{
var groupedList = memberList.GroupBy(x => x.MemberID);
}
(1)几种可能的方法,灵活,但未强制执行类型安全:
- 使用反射提取MemberID的值
- 检查传递对象的类型(例如使用
is
或as
语句),将泛型对象强制转换为正确的类型,然后直接访问该属性 - 在ObjectQuery中使用GroupBy方法,该方法具有用于对键进行分组的字符串参数。当然,您需要将方法参数类型从List更改为其他类型
(2) 推荐的类型安全方式-->定义一个新接口以获取MemberID值,然后将其应用于MemberPurchases和MemberReturns。由于这些类是由EF作为分部生成的,您可以创建一个新的同名分部类文件,然后实现接口。(分部类意味着一个类可以有多个源文件来描述同一个类,因此您可以直接扩展该类)。下面是新创建的.cs
文件中的一个代码示例:
public interface IMember
{
object MemberGenericID{get;}
}
public partial class MemberPurchases : IMember
{
object IMember.MemberGenericID
{
get { return MemberID; }
}
}
public partial class MemberReturns : IMember
{
object IMember.MemberGenericID
{
get { return MemberID; }
}
}
然后你可以这样做:
void Group(List<IMember> list)
{
list.GroupBy(x => x.MemberGenericID)
}