【问题标题】:c# - How to create list/dictionary with descriptive membersc# - 如何使用描述性成员创建列表/字典
【发布时间】:2020-10-05 05:53:34
【问题描述】:

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

//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版本,可能会影响很多东西。

【问题讨论】:

  • 这里的答案可能会有所帮助:stackoverflow.com/questions/30496657/…
  • 制作自己的类/结构怎么样?
  • "var 也没有帮助" - 请注意,var 只是真实类型的占位符。编译代码时,var 将被替换为真实类型。
  • 为什么要使用字典?当 Visual Studio 2019 社区免费时,为什么还要使用 C# Express 2008? Visual Studio Code 也是如此吗? .NET 3.5 也是如此,不再受支持 - 至少 5 年不支持,接近 10 年
  • 您不能从 int 或 double 继承,不是因为它们是密封类,而是因为它们是结构。所有结构都隐含地继承了 ValueType 并被设计密封。

标签: c# .net


【解决方案1】:

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

当你想要的是一个元组或一个简单的自定义结构时,第一个是滥用列表或字典(它们是在运行时可通过索引/键访问的任意长度的结构),它可以在编译时通过名称访问,因此当您在想要 0 时意外设置为索引 1 时会出现令人沮丧的错误。

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

第二个是要避免不小心将Sigma 设置为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.

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

【讨论】:

  • 有超过 20 个字典,包含不同的列表集。为每个列表创建类需要时间,即使我这样做,它也会混淆。我想把它做成单行,就像声明本身一样。
猜你喜欢
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 2021-07-04
相关资源
最近更新 更多