【问题标题】:Writing a generic method for .Field<T>() in Linq to DataSet在 Linq to DataSet 中为 .Field<T>() 编写通用方法
【发布时间】:2010-10-01 19:57:38
【问题描述】:

我一直在尝试编写一个可重用的通用方法来查找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&lt;FType&gt;(Fieldname) == Match

关于我应该如何解决此问题的任何想法?我得到:运算符 '==' 不能应用于 FType 和 FType。

【问题讨论】:

    标签: c# datatable linq-to-objects


    【解决方案1】:

    == 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 用于包括空检查。奇怪的是!= 可以,但不能使用==
    【解决方案2】:

    我会使用IEqualityComparer&lt;T&gt; 进行相等检查。您还可以添加一个重载,其中可以显式指定比较器。

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

    【讨论】:

      【解决方案3】:

      使用 .Equals() 应该可以解决问题。另一种选择是传入 IComparer 或委托 Comparer 以进行自定义比较

      【讨论】:

      • 不错的建议,但.Equals 意味着您必须满足点左侧的空值,但我们不知道FType 是引用类型还是值类型以及它是否可以 是否为空。你可以通过提供两个具有不同通用约束的单独方法来解决这个问题,但这对我来说感觉很丑。
      • @Alex,这两种不同的方法需要的不仅仅是约束不同,因为它们不是签名的一部分。但是您可以在单一方法中安全地包含一个空检查。 where row.Field&lt;FType&gt;(Fieldname) != null &amp;&amp; [other criteria]
      【解决方案4】:

      您可以使用运算符重载:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2011-01-27
        相关资源
        最近更新 更多