2011-04-09 62 views
0

在我的項目中,我的數據層保留了大量的List集合來存儲SQl DB搜索中最後返回的數據。我發現自己重複了很多代碼。其中一個特別用於查看數據對象是否已經在數據庫中,以便可以更新而不是添加。這裏是一個例子:泛型和多個List <>搜索

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; 
    } 

有沒有一種方法,我可以做到這一點使用一個功能和泛型? 我需要重新命名索引字段,以便它們與例如ClassA_ID和ClassB_ID到ID?

+0

使用合併還是使用Upsert? – Pepto 2011-04-09 06:28:16

回答

0

這兩個類都實現了具有ID屬性的接口,然後使用具有約束的泛型(where T : [your interface name])。

此外,

ListClassA.Where(x => x.ClassA_ID == group.ClassA_ID).ToList().Count > 0 

是有點多餘,你可以只使用

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

嗯。是的,我感到我需要這樣的東西。我雖然沒有界面類型 - 呃!現在我只需要添加一些屬性映射和用於訪問數據庫的泛型! – ChrisBD 2011-04-09 06:38:50

1

我會用一個Dictionary代替List緩存:

Dictionary<ClassA_ID, ClassA> classACache; 
... 
classACache.ContainsKey(aitem.ClassA_ID); 
0

你可以在IE上實現IEquatable <T>烏爾類這樣的:

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 <Ť>。載()方法是這樣的:

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."); 

上述代碼的輸出是:

The list contains ItemA.