【问题标题】:Search in a List<DataRow>?在 List<DataRow> 中搜索?
【发布时间】:2011-03-03 21:13:44
【问题描述】:

我有一个从 DataTabe 创建的列表,其中只有一列。假设该列名为 MyColumn。列表中的每个元素都是一个包含我的列的对象数组,在这种情况下,只有一个 (MyColumn)。检查该对象数组是否包含某个值的最优雅的方法是什么?

【问题讨论】:

    标签: c# list linq datatable contains


    【解决方案1】:

    我可能误读了此内容,但似乎数据当前位于 List&lt;object[]&gt; 中而不是数据表中,因此要获取符合特定条件的项目,您可以执行以下操作:

    var matched = items.Where(objArray => objArray.Contains(value));
    

    items 将是您的 object[]:s 列表,matched 将是一个 IEnumerable[]> 与 object[]:s 的值。

    【讨论】:

      【解决方案2】:

      嗯,这取决于您使用的 C# 和 .NET 版本,对于 3.5,您可以使用 LINQ:

      var qualiyfyingRows = 
         from row in rows
         where Equals(row["MyColumn"], value)
         select row;
      
      // We can see if we found any at all through.
      bool valueFound = qualifyingRows.FirstOrDefault() != null;
      

      这将为您提供匹配的行和一个告诉您是否找到任何行的布尔值。

      但是,如果您没有 LINQ 或附带的扩展方法,则必须搜索“old skool”列表:

      DataRow matchingRow = null;
      foreach (DataRow row in rows)
      {
         if (Equals(row["MyColumn"], value))
         {
            matchingRow = row;
            break;
         }
      }
      
      bool valueFound = matchingRow != null;
      

      这将为您提供匹配的第一行,显然可以对其进行更改以查找所有匹配的行,这将使两个示例或多或少相等。

      但 LINQ 版本有一个主要区别,您从中获得的 IEnumerable 是延迟的,因此在您实际枚举它的成员之前不会完成计算。我对 DataRow 或您的应用程序知之甚少,无法知道这是否是一个问题,但这是我处理 NHibernate 的一段代码中的一个问题。基本上我是在枚举一个不再有效的成员序列。

      在 C# 2.0 及更高版本中,您可以通过 iterators 轻松创建自己的延迟 IEnumerables。

      【讨论】:

        【解决方案3】:

        如果你要经常做这个搜索,我觉得每次都写LINQ-expression不太方便。我会这样写扩展方法:

        private static bool ContainsValue(this List<DataRow> list, object value)
        {
            return list.Any(dataRow => dataRow["MyColumn"].Equals(value));
        }
        

        然后进行搜索:

        if (list.ContainsValue("Value"))
        

        【讨论】:

          【解决方案4】:
          var searchValue = SOME_VALUE;
          var result = list.Where(row => row["MyColumn"].Equals(searchValue)); // returns collection of DataRows containing needed value
          var resultBool = list.Any(row => row["MyColumn"].Equals(searchValue)); // checks, if any DataRows containing needed value exists
          

          【讨论】:

            【解决方案5】:

            http://dotnetperls.com/list-find-methods 有关于存在和查找的内容。

            【讨论】:

            • 问题是,列表包含一个我需要搜索的数组......所以我想我不必搜索列表,而是列表中的数组。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-03
            • 1970-01-01
            • 2012-06-04
            相关资源
            最近更新 更多