C# 泛型和多列表<&燃气轮机;搜查

C# 泛型和多列表<&燃气轮机;搜查,c#,list,generics,C#,List,Generics,在我的项目中,我的数据层保存了许多列表集合,用于存储SQl DB搜索中最后返回的数据。我发现自己重复了很多代码。其中一个特别用于查看数据库中是否已经存在数据对象,以便可以对其进行更新而不是添加。以下是一个例子: public List<ClassA> ListClassA; public List<ClassB> ListClassB; public override bool ContainsClassA(ClassA group) {

在我的项目中,我的数据层保存了许多列表集合,用于存储SQl DB搜索中最后返回的数据。我发现自己重复了很多代码。其中一个特别用于查看数据库中是否已经存在数据对象,以便可以对其进行更新而不是添加。以下是一个例子:

public List<ClassA> ListClassA;
public List<ClassB> ListClassB;
    public override bool ContainsClassA(ClassA group)
    {
        if (null == group)
        {
            throw new ArgumentNullException();
        }
        return ListClassA.Where(x => x.ClassA_ID == group.ClassA_ID).ToList().Count > 0;
    }

    public override bool ContainsClassB(ClassB group)
    {
        if (null == group)
        {
            throw new ArgumentNullException();
        }
        return ListClassB.Where(x => x.ClassB_ID == group.ClassB_ID).ToList().Count > 0;
    }
公共列表ListClassA;
公开名单b;
公共覆盖bool ContainsClassA(A类组)
{
if(null==组)
{
抛出新ArgumentNullException();
}
返回ListClassA.Where(x=>x.ClassA\u ID==group.ClassA\u ID).ToList().Count>0;
}
公共覆盖bool ContainsClassB(类别B组)
{
if(null==组)
{
抛出新ArgumentNullException();
}
返回ListClassB.Where(x=>x.ClassB_ID==group.ClassB_ID).ToList().Count>0;
}
有没有一种方法可以使用one函数和泛型来实现这一点?
我是否需要重命名索引字段,使它们匹配,例如ClassA\u ID和ClassB\u ID到ID?

让这两个类实现一个具有ID属性的接口,然后使用带约束的泛型(
其中T:[您的接口名]

而且

有点多余,你可以用

ListClassA.Any(x => x.ClassA_ID == group.ClassA_ID)

我将使用
字典
而不是
列表
进行缓存:

 Dictionary<ClassA_ID, ClassA> classACache;
 ...
 classACache.ContainsKey(aitem.ClassA_ID);
字典类acache;
...
classACache.ContainsKey(aitem.ClassA_ID);

您可以在类上实现IEquatable,如下所示:

public class ClassA : IEquatable<ClassA>
{
    public int ID { get; set; }

    public bool Equals(ClassA other)
    {
        if (this.ID == other.ID)
            return true;

        return false;
    }
}
List<ClassA> ListOfClassA = new List<ClassA>();

ClassA ItemA = new ClassA() { ID = 1 };
ClassA ItemB = new ClassA() { ID = 2 };

ListOfClassA.Add(ItemA);

if (ListOfClassA.Contains(ItemA))
    Console.WriteLine("The list contains ItemA.");

if (ListOfClassA.Contains(ItemB))
    Console.WriteLine("The list contains ItemB.");
公共类ClassA:IEquatable
{
公共int ID{get;set;}
公共布尔等于(A类其他)
{
if(this.ID==other.ID)
返回true;
返回false;
}
}
然后您可以简单地使用List.Contains()方法,如下所示:

public class ClassA : IEquatable<ClassA>
{
    public int ID { get; set; }

    public bool Equals(ClassA other)
    {
        if (this.ID == other.ID)
            return true;

        return false;
    }
}
List<ClassA> ListOfClassA = new List<ClassA>();

ClassA ItemA = new ClassA() { ID = 1 };
ClassA ItemB = new ClassA() { ID = 2 };

ListOfClassA.Add(ItemA);

if (ListOfClassA.Contains(ItemA))
    Console.WriteLine("The list contains ItemA.");

if (ListOfClassA.Contains(ItemB))
    Console.WriteLine("The list contains ItemB.");
List ListOfClassA=新列表();
ClassA ItemA=newclassa(){ID=1};
ClassA ItemB=newclassa(){ID=2};
添加类别列表(项目A);
if(类别包含列表(项目A))
WriteLine(“列表包含ItemA”);
if(类别包含列表(项目B))
WriteLine(“列表包含ItemB”);
上述代码的输出为:

The list contains ItemA.
该列表包含ItemA.Hmm。是的,我觉得我需要这样的东西。我还没有想到接口类型-呸!现在我只需要添加一些属性映射和用于访问数据库的泛型!