首页 > 解决方案 > c# - 如何使用描述性成员创建列表/字典

问题描述

我的代码有很多字典,如下所示

//List[0] => AverageValue,List[1] => MeanValue, List[2] => Maximum

Dictionary<string,List<double>> TestValues ;

//List[0] => Sigma,List[1] => MisValue

Dictionary<string,List<double>> TestSet ;`

因此,如果您看到 List 的不同成员存储不同的类型。我想以智能感知访问这些名称。喜欢TestSet.Sigma=0.1。这样我就不会错误地将MisValue分配给SigmaValue。我试图从 int 派生类,但它是一个密封类。var 也没有帮助,因为我无法将它添加到字典中。元组在我使用的 .net 版本(.net 3.5)中不可用。所以有人请指导我。

注意:我使用的是 Visual c# express 2008。

编辑:公司给了我“visual c# express 2008”。从第一个本身开始,这个应用程序就是使用这个版本创建的。该应用程序还使用第 3 方 dll。所以如果我们改变.net版本,可能会影响很多事情。

标签: c#.net

解决方案


你在这里混合了两种不同的东西:

第一种是滥用列表或字典(它们是在运行时可通过索引/键访问的任意长度的结构),当您想要的是一个元组或一个简单的自定义结构时,它可以在编译时通过名称访问,从而在编译时阻止错误您1在需要时不小心设置为索引0

public struct TestSet
{
    double Sigma {get;set;}
    double MisValue {get;set;}
}

第二个是您要避免意外将 a 设置Sigma为 a MisValue,这是类型的问题。您最初的方法 - 扩展double- 是有道理的,但正如您所发现的那样,在 .NET 中是不可能的。但是您可以使用包装类型和隐式转换来做同样的事情:

public class Sigma
{
    public double Value {get; private set;}

    public Sigma(double value)
    {
        Value = value;
    }

    public static implicit operator double(Sigma sigma) 
    {
        return sigma.Value;
    }

    public static implicit operator Sigma(double value)
    {
       return new Sigma(value);
    }
}

其他值类型也是如此。这将允许您分配double给它们,但不能分配给彼此。将其与上面的自定义结构相结合以获得类型安全的体验:

TestSet set = new TestSet();
set.Sigma = 5.1;               // works - implicit conversion from double.
double sigmaValue = set.Sigma; // works - implicit conversion.
Sigma anotherSigma = set.Sigma;
set.MisValue = anotherSigma;   // doesn't compile - no implicit conversion.

最后,正如评论中所提到的,使用一个 12 年历史的平台,当时对 IDE 进行了六次重大修订,并且对语言进行了五次(我认为)是令人沮丧的,因为许多指南和在线资源可能会至少已经更新到 C# 6。我能想到使用它的唯一原因是与现有代码的兼容性,最好的办法是更新该代码。VS2019 有免费的社区版,VSCode 是免费的。


推荐阅读