代码之家  ›  专栏  ›  技术社区  ›  Josh

.NET向列表中添加一系列字符

  •  2
  • Josh  · 技术社区  · 16 年前

    我想问一下,是否有一种更优雅的方法可以做到这一点:

    List<char> unallowed = new List<char>();
    
    for (char c = '\u0000'; c <= '\u0008'; c++) {
        unallowed.Add(c);
    }
    
    for (char c = '\u000B'; c <= '\u000C'; c++) {
        unallowed.Add(c);
    }
    
    // And so on...
    

    我必须在列表中添加几个连续的Unicode字符范围,我唯一能想到的重构上面代码的方法是创建自己的方法,以避免重复键入for循环。我甚至不太确定它是否值得。

    6 回复  |  直到 16 年前
        1
  •  4
  •   Marc Gravell    16 年前

    嗯,你可以做如下的事情:

        List<char> chars = new List<char>();
        chars.AddRange(Enumerable.Range(0x0000, 9).Select(i => (char)i));
        chars.AddRange(Enumerable.Range(0x000B, 2).Select(i => (char)i));
    

    但不确定它是否值得,尤其是考虑到需要使用“计数”而不是“结束”。可能更容易编写自己的扩展方法…

    static void AddRange(this IList<char> list, char start, char end) {
        for (char c = start; c <= end; c++) {
            list.Add(c);
        }
    }
    static void Main() {
        List<char> chars = new List<char>();
        chars.AddRange('\u0000', '\u0008');
        chars.AddRange('\u000B', '\u000C');
    }
    

    回复您的意见;扩展方法 不是 一个.NET 3.5功能。它们是C 3.0功能。因此,只要将代码集编译为target.net 2.0/3.0(视情况而定),客户机是否没有.net 3.5并不重要;但是,需要定义 ExtensionAttribute -只有几行代码:

    namespace System.Runtime.CompilerServices
    {
        [AttributeUsage(AttributeTargets.Assembly |
            AttributeTargets.Class | AttributeTargets.Method)]
        public sealed class ExtensionAttribute : Attribute { }
    }
    

    或者只是去破掉然后下载 LINQBridge 并使用.NET 2.0中的所有linq to对象。

        2
  •  1
  •   Jon Skeet    16 年前

    添加方法来添加范围可能是最简单的重构,我认为 值得一读,因为它使范围本身更容易阅读。使用 MiscUtil Range 你可以做如下的事情:

    list.AddRange('\u000b'.To('\u000c').Step(1))
    

    但这仍然比有一个额外的方法(可能是一个扩展方法 List<char> ?)写作:

    list.AddCharRange('\u000b', '\u000c');
    

    一个或两个电话的额外故障是可以的,但是如果你重复这几次你 真的? 希望尽可能多地删除无关的文本,使有用的数据脱颖而出。遗憾的是,集合初始值设定项没有考虑扩展方法,否则这将成为一个非常好的解决方案。

    你…吗 一定地 需要一个 列表<字符> 但由于其他限制?这个 声音 就像你真的想要一个 Predicate<char> 说明是否允许使用一个字符-并且可以通过组合范围等来实现。

        3
  •  0
  •   Charlie Salts    16 年前

    在从文件或内部资源中读取的列表中包含不允许使用的Unicode字符,而不是在应用程序中进行硬编码,这是有意义的。

        4
  •  0
  •   Eric J.    16 年前

    这就是我创建char列表的基本方法(实际上是昨天创建的)。如果要添加到列表中的范围很多,可以通过定义一个方法(如addunallowed(char-from,char-to))来简化/减少重复性。

        5
  •  0
  •   Guffa    16 年前

    您可以将范围放在一个数组中并循环:

    char[] ranges = {
       '\u0000','\u0008',
       '\u000b','\u000c',
       '0','9',
       'a','z'
    };
    
    for (int i = 0; i < ranges.Length; i++) {
       for (char c = ranges[i++]; c <= ranges[i]; c++) {
          unallowed.Add(c);
       }
    }
    
        6
  •  0
  •   Achim    16 年前

    您的代码中有一些重复,正如您已经认识到的那样。重复通常是不好的,一个方法会使代码更可读,所以它认为它是值得的。扩展方法怎么样:

    public static class YourHelper
    {
        public static void AddCharRange(this List<char> list, char first, char last)
        {
            for (char c = first; c <= last; c++)
            {
                list.Add(c);
            }
        }
    }
    

    然后:

    List<char> unallowed = new List<char>();
    unallowed.AddCharRange('\u0000', '\u0008');
    

    根据您的用例,我最终将方法命名为“unallow”,而不是“addcharrange”。

    推荐文章