对哈希表列表的Linq操作?

Asked
Viewd1385

0

我正在处理一组旧的DAO代码,这些代码返回一个IList,其中每个Hashtable代表动态执行的SQL查询的行。例如,列表可能包含以下记录/哈希表:

哈希表1:
键:第15列,值:“杰克”
键:列16,值:“史蒂文斯”
键:第18列,值:“ 1973年7月23日”
键:Column25,值:“有效”

哈希表2:
键:第15列,值:“黑色素”
键:Column16,值:“ Teal”
键:Column18,值:“ null”
键:Column25,值:“无效”

Hashtable3:
键:第15列,值:“亨利”
键:Column16,值:“黑色”
键:第18列,值:“ 3/16/1913”
键:Column25,值:“有效”

使用静态类型而不是Hashtable是不可能的,因为查询的结果在运行时是未知的。列数和这些列的性质都是完全动态的。

我希望能够对此数据集执行基于Linq的操作(分组,排序等),但是我绝对无法理解语法的外观。作为一个简单的示例,假设我要按Column15降序对列表进行排序。我想出的最好的语法是:

 var rawGridData = (List<Hashtable>) _listDao.GetListGridContents(listID, null, null);   
var sortedGridData = rawGridData.OrderBy(s => s.Keys.Cast<string>().Where(k => k == "Column15"));     
 

但是,这在枚举sortedGridData时产生一个异常:“至少一个对象必须实现IComparable。”

我已经为这个问题苦苦挣扎了好几天了,并且已经快要死了...请帮忙!

1 个答案

2

这应该使您入门:

 var sortedGridData = rawGridData.OrderBy(r => r["Column15"])
 

这会将每个“记录”映射到“ Column15”中的值,然后对得到的投影进行排序。这很容易推广。

  • 完美运行。我预感这将是一件非常简单的事情。就像我一样,使一个简单的问题变得过于复杂。谢谢!

    Mitch ANovember 13, 2009 14:42
  • 实际上,他真正追求的是如何对结果集执行操作(例如分组,排序等)。挂起的难题在于如何为HashTable的每个实例投影一个表示他所遵循的特定列的值。因此,关键是将HashTable的每个实例投影到该值。剩下的只是细节。

    jasonNovember 13, 2009 14:47
  • OP希望降序,所以OrderByDescending是合适的方法

    Winston SmithNovember 13, 2009 14:45