在C#中,我应该使用什么数据类型来存储具有标准偏差的数字列表?
我正在执行一些测试,我有一个表中有错误的值列表:在C#中,我应该使用什么数据类型来存储具有标准偏差的数字列表?,c#,.net,C#,.net,我正在执行一些测试,我有一个表中有错误的值列表: 12.7 ± 0.3 14.2 ± 0.1 70.8 ± 0.5 我需要将标准偏差与数值保持在一起,因为我需要在以后的各种计算中使用它 目前我正在使用 List<KeyValuePair<double, double>> 列表 但是有更好的解决办法吗 以下是您当前拥有的一些其他选项: 这取决于你选择和使用什么是方便的。不知道性能是否是你想要的 选项1(如果您使用的是C#7.0或更高版本): 怎么样 元组中不会有键值对
12.7 ± 0.3
14.2 ± 0.1
70.8 ± 0.5
我需要将标准偏差与数值保持在一起,因为我需要在以后的各种计算中使用它
目前我正在使用
List<KeyValuePair<double, double>>
列表
但是有更好的解决办法吗 以下是您当前拥有的一些其他选项: 这取决于你选择和使用什么是方便的。不知道性能是否是你想要的 选项1(如果您使用的是C#7.0或更高版本): 怎么样 元组中不会有键值对,而是项 备选案文2: 就像Dan wilson在对你的问题的评论中提到的那样,创建一个包含值和错误的类
public class ValueWithDeviation
{
public double Value {get; set;}
public double Deviation {get; set;}
}
然后您可以拥有
IEnumerable
以下是您当前拥有的一些其他选项:
这取决于你选择和使用什么是方便的。不知道性能是否是你想要的
选项1(如果您使用的是C#7.0或更高版本):
怎么样
元组中不会有键值对,而是项
备选案文2:
就像Dan wilson在对你的问题的评论中提到的那样,创建一个包含值和错误的类
public class ValueWithDeviation
{
public double Value {get; set;}
public double Deviation {get; set;}
}
然后,您可以使用
IEnumerable
,正如DanWilson和Cybercop所建议的,我认为创建一个专用类型()是一种方法,因为带有偏差的值可以一起视为一个逻辑对象。此外,当您想要显示值时,这将使您的工作更轻松,因为您只需要在您的类型中重写ToString
方法
至于底层类型,它可能对您更方便,但这取决于您特定的项目/需求。正如DanWilson和Cybercop所建议的,我认为创建一个专用类型()是一种方法,因为带有偏差的值可以一起视为一个逻辑对象。此外,当您想要显示值时,这将使您的工作更轻松,因为您只需要在您的类型中重写
ToString
方法
至于底层类型,它可能对您更方便,但这取决于您的特定项目/需求。如果值不改变,我将使用struct。您可以添加逻辑(但也可以使用类来添加逻辑)。除非您特别需要双精度,否则使用十进制
public struct StdDev
{
public decimal Val { get; }
public decimal Dev { get; }
public decimal Max { get { return Val + Dev; } }
public decimal Min { get { return Val - Dev; } }
public bool IsInDev (decimal val)
{
return val >= Min && val <= Max;
}
public override string ToString()
{
return $"{Val} +- {Dev}";
}
public StdDev (decimal val, decimal dev)
{
Val = val;
Dev = dev;
}
}
公共结构StdDev
{
公共十进制值{get;}
公共十进制Dev{get;}
公共十进制最大值{get{return Val+Dev;}}
公共十进制Min{get{return Val-Dev;}
公共布尔IsInDev(十进制val)
{
返回val>=Min&&val如果值不改变,我将使用struct。您可以添加逻辑(但也可以使用类来添加)。除非您特别需要double,否则使用decimal
public struct StdDev
{
public decimal Val { get; }
public decimal Dev { get; }
public decimal Max { get { return Val + Dev; } }
public decimal Min { get { return Val - Dev; } }
public bool IsInDev (decimal val)
{
return val >= Min && val <= Max;
}
public override string ToString()
{
return $"{Val} +- {Dev}";
}
public StdDev (decimal val, decimal dev)
{
Val = val;
Dev = dev;
}
}
公共结构StdDev
{
公共十进制值{get;}
公共十进制Dev{get;}
公共十进制最大值{get{return Val+Dev;}}
公共十进制Min{get{return Val-Dev;}
公共布尔IsInDev(十进制val)
{
return val>=Min&&val您当前的解决方案有什么问题,表明您需要更好的解决方案?如何更好?在什么方面?您的解决方案看起来很好。我看不出有什么问题。另一个选项是创建一个类并使用List
,但这可能有些过分。我可能会为val创建一个特定的结构UE和标准偏差
-这里不是真正的键值对
;在我看来,使用键值对
并不能清楚地表达值的含义。对于您的目的来说,双精度足够吗?因为浮点运算可能很混乱。您当前的解决方案有什么问题,表明您需要更好的解决方案?Better如何?在什么方面?您的解决方案看起来很好。我看不出这有什么问题。另一种选择是创建一个类并使用列表
,但这可能有点过头了。我可能会为值和标准偏差
创建一个特定的结构-这里它实际上不是键值对
;使用键值对
IMO没有清楚地表达值的含义。对于您的目的来说,双精度足够吗?因为浮点运算可能会很混乱。基于@Konamiman对“类或结构”的链接,最好将其设计为结构。作为副作用,ValueWithError值(双关语)变得不可变。错误不是偏差的最佳名称。可能值得注意的是,选项1需要C#7.0或更高版本。基于@Konamiman指向“类或结构”的链接,最好将其设计为结构。作为副作用,ValueWithError值(双关语)变得不可变。错误不是偏差的最佳名称。可能值得明确指出的是,选项1需要C#7.0或更高版本。