2010-10-01 21 views
1

我一直在試圖寫一個DataTable查找一個可重用的通用方法。我到目前爲止什麼:編寫一個通用的方法,點域<T>()在LINQ to DataSet中

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, 
    string Fieldname, FType Match) 
{ 
    var result = from row in dataSet.Tables[Tablename].AsEnumerable() 
       where row.Field<FType>(Fieldname) == Match 
       select row; 

    return result; 
} 

但是,我們不喜歡row.Field<FType>(Fieldname) == Match

我想要解決這個問題的任何想法?我得到:運算符'=='不能應用於FType和FType。

回答

3

更換== Match.Equals(Match),你應該是不錯的。如果值可能爲空,我已經在空值檢查中拋出。

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, string Fieldname, FType Match) 
{ 
    var result = from row in dataSet.Tables[Tablename].AsEnumerable() 
       where row.Field<FType>(Fieldname) != null 
       && row.Field<FType>(Fieldname).Equals(Match) 
       select row; 

    return result; 
} 
+0

+1包括空​​校驗。奇怪'!='是好的,但不能使用'=='。 – IAbstract 2010-10-01 22:25:51

0

使用.Equals()應該做的伎倆。另一種選擇是在作爲IComparer或代表比較器對通過自定義比較

+0

不錯的建議,但'.Equals'意味着你必須滿足的點左邊空,但我們不知道是否FType''是引用或值類型以及是否*可以*爲空或不可以。你可以得到解決,通過提供不同的泛型約束兩個不同的方法,但那種感覺很醜陋給我。 – 2010-10-01 20:10:40

+0

@Alex,兩種不同的方法需要通過不僅僅是限制更多的不同,因爲這些都不是簽名的組成部分。但是您可以在單一方法中安全地包含一個空檢查。 '那裏row.Field (字段名)= NULL && [其他條件]' – 2010-10-01 20:14:00

+0

@Anthony - !啊,爽,我就知道我應該解僱了我的IDE :) – 2010-10-01 20:15:09

0

您可以使用運算符重載:

public static bool operator ==(FType a, FType b) 
{ 
    // Your code 
    // Check here if A and B are equal 
} 
1

我會使用IEqualityComparer<T>進行相等性檢查。您也可以在顯式指定比較器的地方添加重載。

private static IEnumerable<DataRow> GetRow<FType>(string Tablename, string Fieldname, FType match) 
{ 
    IEqualityComparer<FType> comp = EqualityComparer<TField>.Default; 
    return dataSet.Tables[Tablename] 
     .AsEnumerable() 
     .Where(comp.Equals(row.Field<FType>(Fieldname), match)); 
}