2014-01-09 116 views
2

简单问题。我有一个Dictionary<int, double>,我希望从列DataTable填充。因此,对于与单个列一个DataTable将单列数据表转换为索引为键的字典

23.9 
39009.0 
32.99 
12.1 

我想Dictionary<int, double>

{ 1, 23.9 }, 
{ 2, 39009.0 }, 
{ 3, 32.99 }, 
{ 4, 12.1 } 

其中键是自动递增。要做到这一点,我写了一些基本的代码:

Dictionary<int, double> d = new Dictionary<int, double>(); 
List<double> tmp = dataTable.AsEnumerable() 
    .Select(c => Double.Parse(c[i].ToString())).ToList(); 

int index = 1; 
foreach (var j in tmp) 
    d.Add(index++, j); 

我可以用一个查询做LINQ吗?我不是一个LINQ粉丝男孩,他喜欢为了它而写它,但我确实喜欢更好的LINQ技能,而且我似乎无法用一个LINQ查询来解决这个问题,尽管它是可能可能。

谢谢你的时间。

回答

9

我可以用LINQ做一个查询吗?

Dictionary<int, double> dict = dataTable.AsEnumerable() 
    .Select((row, index) => new { row, index }) 
    .ToDictionary(x=> x.index + 1, x=> x.row.Field<double>(0)); 
+0

这很甜。我不熟悉'new {row,index}在这里做什么。你能详细说明吗? – MoonKnight

+0

这就是所谓的[匿名类型](http://msdn.microsoft.com/en-us/library/bb397696.aspx)类似于没有名字的类。它有两个属性(在这种情况下):具有正确类型的'row'和'index'('DataRow' +'int')。我需要'ToDictionary'。但是因为只有['Select'](http://msdn.microsoft.com/en-us/library/bb534869(v = vs.110).aspx)(和'Where')有一个超载,它给了我索引在序列中的元素我需要坚持它以某种方式。 –

+0

@Killercam - Tim正在使用select元素值和索引来创建一个在投影序列中同时具有这两个值的新类型。 – Hogan

0

你可以尝试以下方法:

d = tmp.Select((x, i) => new { Value = x, Index = i }).ToDictionary(pair => pair.Index, pair => pair.Value); 
1

有些人可能会发现这个简单...

int index = 1; 
Dictionary<int, double> dict = dataTable.AsEnumerable().ToDictionary(x=>index++, x => x); 

与然而你去更换x => x您元素为所需的double值。

(例如x => x.row.Field<double>(0)如果它是一列数据表)

+0

但是'DataTable'没有扩展方法'ToDictionary'。如果你使用'AsEnumerable()',这是不可能的。 – MoonKnight

+0

我编辑它使用'AsEnumerable()',因为我的测试是在列表上而不是表格。 – Hogan