【问题标题】:Minimalist array creation in c#在 C# 中创建极简主义数组
【发布时间】:2009-05-29 05:24:25
【问题描述】:

我一直希望能够使用下面的行,但 C# 编译器不让我这样做。对我来说,我想要什么似乎是显而易见且毫不含糊的。

myString.Trim({'[', ']'});

我可以通过以下方式实现我的目标:

myString.Trim(new char[]{'[', ']'});

所以我不会想知道有没有其他更接近第一种方法的方法?

【问题讨论】:

    标签: c# arrays


    【解决方案1】:

    string.Trim(...) 方法实际上接受了一个params 参数,所以,你为什么不直接调用:

    myString.Trim('[', ']');
    

    【讨论】:

    • 如果您以前从未使用过“params”,那么值得在 IDE 帮助中查找...
    • 我总是忘记单引号来表示字符。微妙而重要。
    【解决方案2】:

    其他人专注于具体示例(使用参数数组这一事实是可行的方法),但您可能对 C# 3 的隐式类型感兴趣。你可以写:

    myString.Trim(new[] {'[', ']'});
    

    没有相当像你之前那样紧凑,因为你仍然需要表达“我想创建一个数组”的概念,除非你正在编写一个变量初始化器,但是数组是从内容中推断出来的。

    这方面的大用例是匿名类型:

    var skeets = new[] {
       new { Name="Jon", Age=32 },
       new { Name="Holly", Age=33 },
       new { Name="Tom", Age=5 },
       new { Name="Robin", Age=3 },
       new { Name="William", Age=3 }
    };
    

    在这里你不能写出类型的名字,因为它没有名字(这在 C# 中是可以表达的)。

    关于您的具体示例的另一点 - 如果您要经常使用它(即经常调用 Trim 方法),您可能希望避免每次都创建一个新数组:

    private static readonly char[] SquareBrackets = {'[', ']'};
    
    public void Whatever() {
        ...
        foo = myString.Trim(SquareBrackets);
        ...
    }
    

    【讨论】:

    • 在没有“参数”的情况下,总是可以将替代方法与扩展方法放在一起,但我不确定这是否会在上下文中归类为“作弊”这个问题;)
    • 为什么 C# 设计者决定需要“new[]”?可以使用 for { ..., ..., ...} 的语法来声明数组以外的任何内容吗?
    • 匿名类型:new { foo, bar, baz } 有效。同样,当它们只是添加到现有集合时,集合初始值设定项。我认为它让你在做什么更清楚 - 你需要更少的上下文来理解大括号的用途。
    【解决方案3】:

    这也可以...

    myString.Trim( '[',']' );
    

    请注意 Trim 定义中的 params 声明,它可以让您传递任意数量的参数并将它们作为数组接收。

    【讨论】:

      【解决方案4】:

      你也可以试试这个:

      myString.Trim("[]".ToCharArray());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        相关资源
        最近更新 更多