Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#2.0中初始化非空静态集合的正确方法是什么?_C#_Collections - Fatal编程技术网

在C#2.0中初始化非空静态集合的正确方法是什么?

在C#2.0中初始化非空静态集合的正确方法是什么?,c#,collections,C#,Collections,我想在我的C#类中初始化一个静态集合-类似这样: public class Foo { private static readonly ICollection<string> g_collection = ??? } 公共类Foo{ 私有静态只读ICollection g_collection=??? } 我不确定这样做的正确方法;在Java中,我可能会执行以下操作: private static final Collection<String> g_collec

我想在我的C#类中初始化一个静态集合-类似这样:

public class Foo {
  private static readonly ICollection<string> g_collection = ???
}
公共类Foo{
私有静态只读ICollection g_collection=???
}
我不确定这样做的正确方法;在Java中,我可能会执行以下操作:

private static final Collection<String> g_collection = Arrays.asList("A", "B");
private static final Collection g_Collection=Arrays.asList(“A”、“B”);
C#2.0中是否有类似的构造

我知道在C#/.NET的更高版本中,可以使用集合初始值设定项(),但目前我们的系统不支持迁移

为了澄清我最初的问题,我正在寻找一种简洁地声明简单静态集合的方法,例如字符串的简单常量集合。对于更复杂对象的集合,静态初始值设定项样式的方法也是非常好的


谢谢

也许您可以调用一个静态方法:

public class Foo
{
    private static readonly ICollection<string> g_collection = initializeCollection();

    private static ICollection<string> initializeCollection()
    {
        ... TODO allocate and return something here ...
    }
}
公共类Foo
{
私有静态只读ICollection g_collection=initializeCollection();
私有静态ICollection initializeCollection()
{
…在此处分配并返回某些内容。。。
}
}

或者,拥有一个静态构造函数(正如其他人所建议的)可能是等效的,甚至更惯用。

我能想到的唯一方法就是拥有一个静态构造函数。因此,首先在类级别新建一个新集合,然后在静态构造函数中,向其中添加所有值。

您可以声明一个自定义集合类并向其中添加自己的ctor

  public class MyFooCollection: Collection<string>
   {
      public MyFooCollection(string[] values)
      {
          foreach (string s in values)  base.Add(s); 
      }
   }
静态构造:

public class Foo
{
    private static readonly ICollection<string> _collection;

    static Foo()
    {
        _collection = new List<string>();
        _collection.Add("One");
        _collection.Add("Two");
    }
}
公共类Foo
{
私有静态只读ICollection\u集合;
静态Foo()
{
_集合=新列表();
_集合。添加(“一”);
_集合。添加(“两”);
}
}
但请注意,在这种情况下,您只需内联初始化集合(推荐用于):

private static readonly ICollection\u collection=新列表(新字符串[]{“一”,“二”});

这实际上取决于初始化代码的复杂程度。

我喜欢使用
IEnumerable.ToList()

此外,如果您的集合应该是只读的,则可以使用
System.Collections.ObjectModel.ReadOnlyCollection

private readonly ICollection<string> collection = new string[] { "a", "b", "c" }.ToList();

private readonly ReadOnlyCollection<string> collection2 = new ReadOnlyCollection<string>(new string[] { "a", "b", "c" });
编辑#2: 我刚刚意识到ToList是一个扩展函数,只能在C#3.0中使用。但是,您仍然可以使用列表构造函数:

private readonly IList<string> = new List<string>(new string[] { "a", "b", "c" });
private readonly IList=新列表(新字符串[]{“a”、“b”、“c”});

不过,对于只读列表,我更喜欢使用
ReadOnlyCollection

使用静态构造函数,如下所示:

public class Foo
{
    static readonly ICollection<string> g_collection;

    // Static constructor
    static Foo()
    {
        g_collection = new List<string>();
        g_collection.Add("Hello");
        g_collection.Add("World!");
    }
}
公共类Foo
{
静态只读ICollection g_集合;
//静态构造函数
静态Foo()
{
g_collection=新列表();
g_集合。添加(“你好”);
g_系列。添加(“世界!”);
}
}

除了静态构造函数之外,这也将起作用

    public class Foo
    {
        private static readonly ICollection<string> _collection = 
              new List<string>(new string[] { "elem1", "elem2", "...", "elemn" });
    }
公共类Foo
{
专用静态只读ICollection\u collection=
新列表(新字符串[]{“elem1”、“elem2”、““…”、“elemn”});
}

如果我完全理解您的问题,其他人似乎没有抓住重点,您希望以类似于Java的方式创建一个静态集合,您可以在一行代码中声明和填充,而无需创建专门的方法(根据其他一些建议)。这可以使用数组文字(写在两行上以防止滚动)完成:

专用静态只读ICollection字符串=
新字符串[]{“你好”,“世界”};
这将一次性使用项列表声明和填充新的只读集合。适用于2.0和3.5版本,我测试它只是为了更加确定

在3.5中,您可以使用类型推断,因此不再需要使用字符串[]数组,该数组将删除更多的击键:

private static readonly ICollection<string> Strings = 
  new[] { "Hello", "World" };
专用静态只读ICollection字符串=
新[]{“你好”,“世界”};
请注意第二行中缺少的“string”类型。从数组初始值设定项的内容自动推断字符串

如果要将其填充为列表,只需将新的字符串[]更改为新的列表a:

private static readonly ICollection<string> Strings = 
  new List<string>() { "Hello", "World" };
专用静态只读ICollection字符串=
新列表(){“你好”,“世界”};
当然,由于您的类型是IEnumerable而不是特定的实现,如果您想访问特定于List的方法,例如.ForEach(),则需要将其转换为List:

((List<string>)Strings).ForEach(Console.WriteLine);
((列表)字符串).ForEach(Console.WriteLine);
但为可迁移性付出的代价很小[这是一个词吗?]。

您有两个选择:

  • 使用静态方法的返回值初始化集合

  • 使用静态构造函数创建集合,填充它并将其初始化为静态变量


  • 从性能角度来看,选项1更好,因为对于静态构造函数,运行时必须在每次访问类之前检查是否调用了静态构造函数。

    您可以通过进一步调整初始化来进一步增强代码的可读性:…=新列表(){“一”、“二”};是的,这是我的意图-我将编辑问题,使其更清楚。谢谢
    private static readonly ICollection<string> Strings = 
      new string[] { "Hello", "World" };
    
    private static readonly ICollection<string> Strings = 
      new[] { "Hello", "World" };
    
    private static readonly ICollection<string> Strings = 
      new List<string>() { "Hello", "World" };
    
    ((List<string>)Strings).ForEach(Console.WriteLine);