Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环通过BsonArray转换为双类型列表?_C#_Mongodb_Asp.net Core - Fatal编程技术网

C# 如何循环通过BsonArray转换为双类型列表?

C# 如何循环通过BsonArray转换为双类型列表?,c#,mongodb,asp.net-core,C#,Mongodb,Asp.net Core,我正在收到BsonArray表格db。 当我试图像这样迭代这个BsonArray时 Console.WriteLine(data["avgResponseTimes"].GetType()); foreach(var singleRecord in data["avgResponseTimes"]){ chatResponses.Add(Convert.ToDouble(singleRecord)); } Console.WriteLine("each list average -- "

我正在收到
BsonArray
表格db。 当我试图像这样迭代这个
BsonArray

Console.WriteLine(data["avgResponseTimes"].GetType());
foreach(var singleRecord in data["avgResponseTimes"]){
   chatResponses.Add(Convert.ToDouble(singleRecord));
}
Console.WriteLine("each list average -- " + chatResponses.Average());
foreach statement cannot operate on variable of type 'BsonValue' because 'BsonValue' doesn't contain a public instance definition for 'GetEnumerator'
所以它抛出了这样一个错误

Console.WriteLine(data["avgResponseTimes"].GetType());
foreach(var singleRecord in data["avgResponseTimes"]){
   chatResponses.Add(Convert.ToDouble(singleRecord));
}
Console.WriteLine("each list average -- " + chatResponses.Average());
foreach statement cannot operate on variable of type 'BsonValue' because 'BsonValue' doesn't contain a public instance definition for 'GetEnumerator'
但是当我操控
数据[“avgressponsetimes”]
类型时,它会显示
MongoDB.Bson.BsonArray
,但它不允许我遍历这个BsonArray列表。我想将此
BsonArray
转换为
double
类型列表,以获得列表的平均值。如何在c#(asp.net core 2.2)中做到这一点?

c#是一种强类型和静态类型(即类型应在构建时一致,而不仅仅是在运行时一致)语言

虽然您知道
data[“avgressponsetimes”]
返回一个
BsonArray
,但它实际上是作为其基本类型公开的:
BsonValue
。C>不能预测<代码>数据[avgRealsSimeTime] < /C> >将是<代码> BsonArray < /C> >(与“<代码> BSONTROOS< /COD> >相反”),因此必须只考虑基类型中可用的方法和属性(<代码> BSONValue)。code>BsonValue
没有定义
GetEnumerator()
,因此不能将其与
foreach
一起使用

您可以检查
data[“avgressponsetimes”]
是否为
BsonArray
并使用模式匹配提取值:

if (data["avgResponseTimes"] is BsonArray responseTimes)
或者,如果您确定它将始终是一个BsonArray,您可以将其投下:

var responseTimes = (BsonArray)data["avgResponseTimes"]; // explicit
var responseTimes = data["avgResponseTimes"] as BsonArray; // implicit
请注意,如果
数据[“avgressponsetimes”]不是
BsonArray`,则上述隐式转换将返回
null

假设“avgResponseTimes”是来自数据库的
double
数组,您可能可以使用LINQ而不是
foreach
循环:

var responseTimes = (BsonArray)data["avgResponseTimes"];
chatResponses.AddRange(responseTimes.Select(t => t.AsDouble));

你需要先投它。@John\u\n我怎么能投呢?