【问题标题】:How to define a lengthy type as a custom type?如何将冗长的类型定义为自定义类型?
【发布时间】:2013-06-07 18:22:25
【问题描述】:

我认为我只是对我想要的东西使用了错误的描述,这就是为什么我找不到答案,但基本上我想做以下事情:

// Go from this
List<string>[] myvar = new List<string>()[5];
myvar[4].Add("meow");

// To this
LString myvar = new LString();
myvar.Add("meow");

我最初尝试做一个课程public class LString : List&lt;string&gt;()[],但这不是真正有效的语法,所以我真的不知道从那里去哪里。

【问题讨论】:

  • 你想要一个字符串列表数组?
  • 关于您的示例的问题:您的LString 如何知道您想将“喵”添加到最后一个列表数组,而不是说第一个、第三个等?
  • 我认为他想要一个预分配列表(长度为 5),但他创建了一个列表数组?
  • 你能解释一下这个逻辑的上下文吗?这可能是一个错误的方法...
  • 我想我应该把这一切都放在实际的问题中,但是我解码了 3 个字节的数据,每个字节里面可以有多个解码。所以我想,三个数组,你可以在每个字节中添加尽可能多的字符串。所以每个索引实际上只代表它的字节。使用它时更有意义并且更容易阅读,使用我在问题中使用的语法来做到这一点,我只是想简化声明,因为它在很多地方都被调用。

标签: c# arrays custom-type


【解决方案1】:

这是一个封装的方法:

public class LString
{
    List<string>[] _strListArray;

    public LString(int size)
    {
        _strListArray = new List<string>[size];
    }

    public void Add(int index, string str)
    {
        _strListArray[index].Add(str);
    }

    public void Remove(int index, string str)
    {
        _strListArray[index].Remove(str);
    }

    // insert more code for list manipulation
}

这可能不是最干净的代码,但它不是继承自 List&lt;T&gt;

【讨论】:

  • 我试图避免这样的事情,因为它需要我基本上为我最终使用的 List 的每个函数制作一个包装函数,而不是制作一个包装器(类或其他...问题的要点)结构本身。如果这真的是唯一的好方法,而不是每次都把它吸干并重写类型,那么好吧,我可能只是处理它。
  • 我同意你重新创建列表操作所需的所有方法。这将变得相当冗长,具体取决于您希望在列表数组上拥有哪些功能。
【解决方案2】:

要从List&lt;string&gt; 派生类,请使用以下语法:

public class LString : List<string>
{
}

无法从数组中进一步派生类。因此,您必须对以下内容感到满意:

LString[] myvar = new LString[5];

编辑:

根据反馈,您最好执行以下操作来包含您的列表:

public class LString
{
  private List<string>[] _lists = new List<string>[5];

  public void Add(int index, string value)
  {
    if (index < 0 || index > 4)
      throw new ArgumentOutOfRangeException("index");
    _lists[index].Add(value);
  }
}

【讨论】:

  • 就我个人而言,我认为从列表继承很少有用,而且经常出现问题。列表通常应该被封装。没有继承。
  • @Marc 可能与问题无关,但我很想听听推理。
  • @Marc 这取决于您的班级是“是”列表还是“有”列表。这还取决于您是否希望能够简单地向List&lt;T&gt; 的现有实现添加额外的功能。
  • @Rotem 好吧,首先 List-of-T 没有有用的虚拟方法,所以你不能做任何有用的多态(验证等)。使用扩展方法可能会更好地完成其他方法。所以这意味着这样做的主要有用的其他原因是添加额外的字段/属性 - 但这不适用于框架的某些核心部分:标准序列化程序和数据绑定工具假设某些东西是(排他的) 一个列表一个实体;因此,您无法正确地对自定义列表的这些附加成员进行数据绑定或序列化。
  • @MarcGravell 感谢您的解释。
猜你喜欢
  • 2020-03-17
  • 1970-01-01
  • 2019-05-17
  • 2022-01-22
  • 2021-01-25
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多