【问题标题】:How to initialize a list of strings (List<string>) with many string values如何使用许多字符串值初始化字符串列表 (List<string>)
【发布时间】:2011-03-09 12:31:50
【问题描述】:

如何初始化(使用 C# 初始化程序)字符串列表?我已经尝试过下面的示例,但它不起作用。

List<string> optionList = new List<string>
{
    "AdditionalCardPersonAddressType","AutomaticRaiseCreditLimit","CardDeliveryTimeWeekDay"
}();

【问题讨论】:

标签: c# string list


【解决方案1】:

如果您使用的是 C# 9.0 及更高版本,则可以使用新功能 target-typed new expressions Link

例子:

List<string> stringList = new(){"item1","item2", "item3"} ;

【讨论】:

    【解决方案2】:

    与声明一起初始化的正确方法是:

    List<string> optionList = new List<string>()
    {
        "AdditionalCardPersonAdressType","AutomaticRaiseCreditLimit","CardDeliveryTimeWeekDay"
    };
    

    【讨论】:

      【解决方案3】:

      我已经看到内容标签 C#,但如果有人可以使用 Java(此处使用相同的搜索词):

      List<String> mylist = Arrays.asList(new String[] {"element1", "element2", "element3" }.clone());
      

      【讨论】:

        【解决方案4】:

        还有一些您可能会遗漏但尚未提及的内容。我认为这可能是您遇到的问题,因为我怀疑您已经尝试删除尾随 () 并且仍然出现错误。

        首先,就像其他人在这里提到的那样,在您的示例中,您确实需要删除尾随 ();

        另外,请注意 List 位于 System.Collections.Generic 命名空间中。

        因此,您需要执行以下两个选项之一: [下面的#1 可能是更受欢迎的选项]

        (1) 在代码顶部包含对命名空间的使用: 使用 System.Collections.Generic;

        (2) 将 List 的完全限定路径放入您的声明中。

        System.Collections.Generic.List optList=new System.Collections.Generic.List { "AdditionalCardPersonAddressType","AutomaticRaiseCreditLimit","CardDeliveryTimeWeekDay" };

        希望对您有所帮助。

        当您正确实现 List 但未包含 System.Collections.Generic 命名空间时收到的错误消息具有误导性且没有帮助:

        “编译器错误 CS0308:非泛型类型 List 不能与类型参数一起使用。”

        PS - 它给出了这个无用的错误,因为如果您没有指定您打算使用 System.Collections.Generic.List,编译器会假定您正在尝试使用 System.Windows.Documents.List。

        【讨论】:

          【解决方案5】:

          一个非常酷的功能是列表初始化器也可以很好地与自定义类一起使用:您只需实现 IEnumerable 接口并拥有一个名为 Add 的方法。 p>

          例如,如果您有这样的自定义类:

          class MyCustomCollection : System.Collections.IEnumerable
          {
              List<string> _items = new List<string>();
          
              public void Add(string item)
              {
                  _items.Add(item);
              }
          
              public IEnumerator GetEnumerator()
              {
                  return _items.GetEnumerator();
              }
          }
          

          这将起作用:

          var myTestCollection = new MyCustomCollection()
          {
              "item1",
              "item2"
          }
          

          【讨论】:

            【解决方案6】:
            List<string> mylist = new List<string>(new string[] { "element1", "element2", "element3" });
            

            【讨论】:

            • 我认为这里没有充分的理由初始化一个字符串数组来创建这个对象。任何正在寻找的人,请使用其他答案之一。
            • @Unsliced 和 @Padel 有更正确的答案。如果您使用 { } 进行初始化,则无需传入另一个 new 任何东西
            • 对于 C++ CLI 就像:Collections::Generic::List&lt;int&gt;^ mylist = gcnew Collections::Generic::List&lt;int&gt;(gcnew array&lt;int&gt;{0, 1, 2, 3, 4})
            • @Bobrot 为什么?因为分配new String[] 效率不高?
            • @DylanChensky 我会说作为一般规则,做任何不必要的事情都是低效的。诚然,这一个实例可能没什么大不了的,但想象一下,如果您的代码中到处都是这样的项目。总体而言,它可能会产生很大的不同,尤其是在内存使用方面。
            【解决方案7】:
            var animals = new List<string> { "bird", "dog" };
            List<string> animals= new List<string> { "bird", "dog" };
            

            以上两种是最快捷的方式,请看https://www.dotnetperls.com/list

            【讨论】:

            • 这比接受的答案更受欢迎吗?看起来更简单,不需要中间的string[]
            • var animals = new List&lt;string&gt; { "bird", "dog" }; 在接受的答案中没有被建议。此外,(new string[] 是可以避免的已接受答案中的添加命令。
            【解决方案8】:

            像这样移动圆括号:

            var optionList = new List<string>(){"AdditionalCardPersonAdressType","AutomaticRaiseCreditLimit","CardDeliveryTimeWeekDay"};
            

            【讨论】:

            【解决方案9】:

            这是你初始化的方式,如果你想让它更动态,你也可以使用 List.Add()。

            List<string> optionList = new List<string> {"AdditionalCardPersonAdressType"};
            optionList.Add("AutomaticRaiseCreditLimit");
            optionList.Add("CardDeliveryTimeWeekDay");
            

            这样,如果你从 IO 中取值,你可以将它添加到一个动态分配的列表中。

            【讨论】:

            • 事实上,这就是任何人在使用 C# 3.0 的 Collection 初始化器特性“幕后”发生的事情(我的意思是,最后所有这些参数最终都出现在 Add 命令中(如果好奇,请尝试它在sharplab.io)
            【解决方案10】:

            你会这样做。

            List &lt;string&gt; list1 = new List &lt;string&gt;();

            不要忘记添加

            using System.Collections.Generic;

            【讨论】:

              【解决方案11】:

              您的功能很好,但无法正常工作,因为您将() 放在最后一个} 之后。如果您将() 移动到顶部,紧邻new List&lt;string&gt;(),错误就会停止。

              示例如下:

              List<string> optionList = new List<string>()
              {
                  "AdditionalCardPersonAdressType","AutomaticRaiseCreditLimit","CardDeliveryTimeWeekDay"
              };
              

              【讨论】:

                【解决方案12】:

                你还没有真正问过问题,但代码应该是

                List<string> optionList = new List<string> { "string1", "string2", ..., "stringN"}; 
                

                即列表后没有尾随 ()。

                【讨论】:

                • 错误7 A new expression requires () or [] after type
                • @blgnklc,因为您使用的 C# 2 不支持此功能。
                • var optionList = new List { "string1", "string2", ..., "stringN"};
                【解决方案13】:

                只需删除最后的()

                List<string> optionList = new List<string>
                            { "AdditionalCardPersonAdressType", /* rest of elements */ };
                

                【讨论】:

                • 您指的是特定版本的 .NET/C# 吗?据我所知,这项工作从 v3.5 及更高版本开始。不知道2.0,因为我有一段时间没有使用它......
                • asp.net 2.0 btw 我在 { -> Error 7 A new expression requires () or [] after type 后得到错误
                • 在 2.0 中,您必须像这样使用它:List&lt;string&gt; optionList = new List&lt;string&gt;() { "AdditionalCardPersonAdressType", /* rest of elements */ };。注意这里的()new List&lt;string&gt;()
                • 它是 C# 3 语言功能,与您使用的框架版本无关。如果您仍在使用 Visual Studio 2005,您将无法使用此功能。
                猜你喜欢
                • 2018-09-27
                • 2016-07-25
                • 1970-01-01
                • 2014-03-04
                • 2016-07-27
                • 2015-09-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多