C# 对象为IEnumerable<;双倍>;

C# 对象为IEnumerable<;双倍>;,c#,C#,我从没想到这个问题会给我带来这么多麻烦,但经过几个小时的实验和谷歌搜索,我终于来了。我有一个哈希表,其中的值是int和double的数组。我想将哈希表的内容处理为double的数组。我尝试过的每件事都给了我一个无效的强制转换异常 以下是我尝试过的一些例子: var h = new Hashtable() { { "Integer", new[] { 1, 2 } }, { "Double", new[] { 2.0, 3.0 } }; // Just c

我从没想到这个问题会给我带来这么多麻烦,但经过几个小时的实验和谷歌搜索,我终于来了。我有一个
哈希表
,其中的值是
int
double
的数组。我想将
哈希表的内容处理为
double
的数组。我尝试过的每件事都给了我一个无效的强制转换异常

以下是我尝试过的一些例子:

var h = new Hashtable() { { "Integer", new[] { 1, 2 } }, { "Double", new[] { 2.0, 3.0 } };

// Just cast it to a double
var d = (h.Keys as IEnumerable).Cast<double>(); // Invalid cast exception when enumerating

// Maybe casting to an object first will resolve the casting issues?
var d1 = (h.Keys as IEnumerable).Cast<object>().Cast<double>(); // Invalid cast exception when enumerating
var h=new Hashtable(){{“Integer”,new[]{1,2}},{“Double”,new[]{2.0,3.0};
//把它扔到一个双人床上
var d=(h.Keys as IEnumerable).Cast();//枚举时发生无效的强制转换异常
//也许先对某个对象进行强制转换可以解决强制转换问题?
var d1=(h.Keys为IEnumerable).Cast().Cast();//枚举时发生无效的强制转换异常

如何将
h
中的所有值作为双精度值使用?

改用字典如何

var h = new Dictionary<string, object[]>() {
    {"Integer", new object[] {1, 2, 3}},
    {"Double", new object[] {1.0, 2.0,3.0}
}};

var doubles = h.SelectMany(i => i.Value)
               .Select(i => Convert.ToDouble(i));
Console.WriteLine(string.Join(", ", doubles));

但是,我建议切换到字典,因为它是一个通用集合(System.Collections.generic namespace),速度更快,而且您可以通过使用
Linq
语法轻松地操作数据。

改用字典怎么样

var h = new Dictionary<string, object[]>() {
    {"Integer", new object[] {1, 2, 3}},
    {"Double", new object[] {1.0, 2.0,3.0}
}};

var doubles = h.SelectMany(i => i.Value)
               .Select(i => Convert.ToDouble(i));
Console.WriteLine(string.Join(", ", doubles));

但是,我建议切换到字典,因为它是一个通用集合(System.Collections.generic namespace),速度更快,而且您可以使用
Linq
语法轻松地操作数据。

哈希表的
属性只不过是字符串“Integer”和“Double”,因此,很不幸,是的,尝试将字符串“Integer”强制转换为double会引发异常

尝试使用
哈希表
实例的
属性。每个值都有自己的类型。在本例中,
int[]
double[]
,因此
h.Values
不过是一个
i集合
,它还实现了一个
IEnumerable
,这意味着,正如您所知,您可以在上使用Linq Cast扩展方法

尽管值得一提的是,我从未建议您这样做(正如许多人所建议的那样,使用
IDictionary
可能更方便),但我认为您的问题的答案如下,因为
int
double
都实现了
IComparable
接口:

 h.Values
  .Cast<Array>()
  .SelectMany(a => a.Cast<IComparable>())
  .Select(c => Convert.ToDouble(c))
h.值
.Cast()
.SelectMany(a=>a.Cast())
.Select(c=>Convert.ToDouble(c))

您的
哈希表的
属性
只不过是字符串“Integer”和“Double”,因此不幸的是,如果尝试将字符串“Integer”强制转换为Double,会引发异常

尝试使用
哈希表
实例的
属性。每个值都有自己的类型。在本例中,
int[]
double[]
,因此
h.Values
不过是一个
i集合
,它还实现了一个
IEnumerable
,这意味着,正如您所知,您可以在上使用Linq Cast扩展方法

尽管值得一提的是,我从未建议您这样做(正如许多人所建议的那样,使用
IDictionary
可能更方便),但我认为您的问题的答案如下,因为
int
double
都实现了
IComparable
接口:

 h.Values
  .Cast<Array>()
  .SelectMany(a => a.Cast<IComparable>())
  .Select(c => Convert.ToDouble(c))
h.值
.Cast()
.SelectMany(a=>a.Cast())
.Select(c=>Convert.ToDouble(c))


不要使用HashTable
或任何其他非泛型数据结构。它只会导致一百万个不同的问题。“我们不建议您在新开发中使用HashTable类。相反,我们建议您使用泛型Dictionary类。”…@Servy和@quaabamm绝对正确。不要使用
哈希表
!但是,即使使用正确的
字典
,您仍然可以编写
新字典().Keys.Cast()
那么……当你知道键是字符串,因为你正在设置它们时,你到底为什么要这么做?@AluanHaddad显然这是个错误。当你被迫强制转换所有内容,并且没有编译器告诉你什么类型的错误时,犯这个错误要容易得多。@AluanHaddad我想他把键f搞混了或值。不要使用
哈希表
,或任何其他非通用数据结构。这只会导致一百万个不同的问题。“我们不建议您在新开发中使用哈希表类。相反,我们建议您使用通用字典类。”…@Servy和@quaabamm绝对正确。不要使用
哈希表
!但是,即使使用正确的
字典
,您仍然可以编写
新字典().Keys.Cast()
那么……当你知道键是字符串,因为你正在设置它们时,你到底为什么要这么做?@AluanHaddad显然这是个错误。当你被迫强制转换所有内容,并且没有编译器告诉你什么类型的错误时,犯这个错误要容易得多。@AluanHaddad我想他把键f搞混了或值。为什么要将值存储在object[]类型的数组中?为什么不使用精确类型?因为值不是相同的类型,字典必须指定一个。如果使用泛型,则需要单独的集合,没有字典。很好!为了OP的好处和答案的完整性,我想添加一个解释,说明为什么不使用
哈希表
。我知道注释中有链接,但我不知道k在回答中作为解释也会很有帮助。@Servy根据OP,他有两种不同的类型。这就是为什么我去使用对象[]@LuisLavieri但他需要两种不同的类型吗?他们明确表示,他们希望它们都是双重的。他们不属于同一类型正是试图解决的问题,这是一个可以静态完成的问题,而不是以不正确的格式创建一个类型,然后在运行时将其重新创建为什么你想要所有的一切