Написание универсального метода для .Field <T>() в Linq для DataSet - PullRequest
1 голос
/ 01 октября 2010

Я пытался написать универсальный метод многократного использования для поиска на DataTable.Что у меня есть на данный момент:

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.

Ответы [ 4 ]

3 голосов
/ 02 октября 2010

Замените == 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;
} 
1 голос
/ 02 октября 2010

Я бы использовал 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));
}
0 голосов
/ 02 октября 2010

Вы можете использовать перегрузку оператора:

public static bool operator ==(FType a, FType b)
{
    // Your code
    // Check here if A and B are equal
}
0 голосов
/ 02 октября 2010

Использование .Equals () должно помочь.Другой вариант - передать IComparer или делегат Comparer для пользовательского сравнения

...