C#中是否有用于跟踪字符级元数据(标签)的字符串的内置功能?

时间:2014-02-21 19:09:05

标签: c# .net regex string stringbuilder

C#中是否有一些类似字符串的类,并允许我存储某些字符/单词的自定义元数据(标签)?

例如,对于字符串Example string,我可能想要添加大写字母E 大写字母的信息,我可能想添加一些字母的类型(比如说) vocals )。然后我可能想在字符串上调用.Replace.Trim,我需要结果仍然包含序列中未更改字母的'tags'。

在C#/ .NET中是否可以这样,而不必自己编写所有逻辑?

2 个答案:

答案 0 :(得分:1)

“有什么内置”的答案是否定的。

但是,您可以创建自己的类来处理所需的任何元数据信息结构,并将string值公开为内部属性。您也可以使用它来覆盖ToString()方法。通过这种方式,您将能够传递您的对象并仍使用其string等效对象。

通过重载运算符,您还可以对常规string实例进行转换和比较。

答案 1 :(得分:1)

只是为了它的乐趣!

快速运行:

  1. 下载永远令人惊叹的LinqPad
  2. 打开它并选择Language C# Program
  3. 粘贴以下代码
  4. Alt + X

  5. void Main()
    {
        string str = "Example, string";
        var output = Explain(str);
    
        OutputExplanation(output);
    }
    
    private void OutputExplanation(List<LetterExplanation> input)
    {
        StringBuilder sb = new StringBuilder();
    
        foreach(var ltr in input)
            sb.AppendFormat("The letter {0} is {1}\n", ltr.Letter, ltr.Type);
    
        sb.ToString().Dump();
    }
    
    private List<LetterExplanation> Explain(string input) 
    {
        var sb = new List<LetterExplanation>();
    
        foreach(char c in input.ToCharArray())
        {
            //c.Dump(); 
            LetterType type = LetterType.Character;
    
            // vowel, consonant or special
            if("aeiou".IndexOf(c.ToString(), StringComparison.InvariantCultureIgnoreCase) >= 0)
                type |= LetterType.Vowel;
            else if(" ,.-_<>/\\".IndexOf(c.ToString(), StringComparison.InvariantCultureIgnoreCase) >= 0)
                type |= LetterType.Special;
            else
                type |= LetterType.Consonant;
    
            // uppercase or lowercase
            if(char.IsUpper(c) && (type & LetterType.Special) != LetterType.Special)
                type |= LetterType.Uppercase;
            else if((type & LetterType.Special) != LetterType.Special)
                type |= LetterType.Lowercase;
    
            // add
            sb.Add(new LetterExplanation() { Letter = c, Type = type });
        }
    
        return sb;
    } 
    
    [Flags]
    public enum LetterType {
        Vowel = 1, Consonant = 1 << 1, Uppercase = 1 << 2, Lowercase = 1 << 3, Number = 1 << 4, Special = 1 << 5, Character = 1 << 6
    }
    
    public class LetterExplanation
    {
        public char Letter { get; set; }
        public LetterType Type { get; set; }
    }
    

    您的输出结果为:

    The letter E is Vowel, Uppercase, Character
    The letter x is Consonant, Lowercase, Character
    The letter a is Vowel, Lowercase, Character
    The letter m is Consonant, Lowercase, Character
    The letter p is Consonant, Lowercase, Character
    The letter l is Consonant, Lowercase, Character
    The letter e is Vowel, Lowercase, Character
    The letter , is Special, Character
    The letter   is Special, Character
    The letter s is Consonant, Lowercase, Character
    The letter t is Consonant, Lowercase, Character
    The letter r is Consonant, Lowercase, Character
    The letter i is Vowel, Lowercase, Character
    The letter n is Consonant, Lowercase, Character
    The letter g is Consonant, Lowercase, Character
    

    enter image description here