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我怎么能投呢?