";标记“;列表中的字符串<>;

本文关键字:gt 字符串 lt 列表 quot 标记 | 更新日期: 2023-09-27 18:26:41

我有三种类型的字符串,需要将它们按特定顺序放入单个列表中。我所说的"三种类型"是指有三种处理字符串的方法。我想用这样的struct放在列表中:

struct Chunk
{
    public char Type;   // 'A', 'B' or 'C'.
    public string Text;
}

也许有更好的方法来标记字符串,说明它应该如何处理?

";标记“;列表中的字符串<>;

您可以使用枚举。这将为您提供Intellisense和错误检查。

struct Chunk
{
    public TheType Type;   // 'A', 'B' or 'C'.
    public string Text;
}
enum TheType { A, B, C }

我不会在这里使用struct——类应该做得很好。有一些预构建的数据类型可以用于标记:

  • 字典迭代器中使用的类型KeyValuePair<K,V>允许您在不定义新类型的情况下将值与键配对
  • 从.NET 4.0开始,您可以使用Tuple<T1,T2>对任意类型的项进行配对

我建议定义一个enum,而不是使用char作为类型:这应该会使程序具有更好的可读性。

根据您将如何使用这些块,多态性可能是您的朋友。区块的Type实际上携带了您的"Type"信息:

public abstract class Chunk {
   public string Text { get; private set; }
   protected Chunk(string text) {
      Text = text;
   }
}
public class ATypeChunk : Chunk {
   public ATypeChunk(string text) : base(text) { }
}
public class BTypeChunk : Chunk {
   public BTypeChunk(string text) : base(text) { }
}

从某些来源创建块:

public IEnumerable<Chunk> GetChunks(string dataToBeParsed) {
   while ( /* data to be parsed */ ) {
      // Determine chunk type
      switch ( /* some indicator of chunk type */ ) {
         case 'A':
            yield return new ATypeChunk(chunkText);
         case 'B':
            yield return new BTypeChunk(chunkText);
      }     
   }
}

然后,以下是您在使用它们时不要做的事情*:

public UseChunk(Chunk chunk) {
   if (chunk is ATypeChunk)
      // Do something A specific
   else if (chunk is BTypeChunk)
      // Do something B specific
}

*好吧,你可以,但可能有更好的方法。例如,访问者模式在这里有一个常见用法。

当我还在努力思考这一切时,我问了一个问题:

  • 虚拟调用与类型检查的另一个示例

关注Array。排序方法:)http://msdn.microsoft.com/en-us/library/system.array.sort.aspx