2015-12-03 4 views
8

Я хочу, чтобы заполнить список строковых массивов во время компиляцииИнициализация списка с массивами

что-то вроде этого:

 List<string[]> synonyms = new List<string[]> 
     { 
      { "enabled", "enable", "enabling" }, 
      { "disabled", "disable", "disabling" }, 
      { "s0", "s0 state" }, 
      { "s5", "s5 state" } 
     }; 

, но я получаю ошибку компиляции: No overloaded method 'Add' takes 2 arguments

Почему это? Это работает, если они не были струнные массивы с List<string>

+0

Вы рассматриваете свою коллекцию в словарь вместо списка. –

+0

Словари могут содержать только пару, я хочу иметь больше пары, если необходимо – dukevin

+0

В этом случае вам может понадобиться какой-то пользовательский класс модели, который берет ваше левое значение, например. s0 или s5, и в этой пользовательской модели добавляют синонимы, которые являются списком строк. То, что у вас на данный момент, не сработает. –

ответ

6

Причина того, что делает ваш код не работа пишется в How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide):

A Dictionary contains a collection of key/value pairs. Its Add method takes two parameters, one for the key and one for the value. To initialize a Dictionary, or any collection whose Add method takes multiple parameters, enclose each set of parameters in braces...

Таким образом, в синтаксисе

{ 
     { "enabled", "enable", "enabling" }, 
    } 

Компилятор ожидающей свою коллекцию, чтобы a Add(string, string, string) метод. Поскольку такой метод отсутствует на List<string []>, ваша компиляция не выполняется.

На самом деле, можно создать такую ​​коллекцию и инициализировать ее с помощью этого синтаксиса.Если вы создаете следующую коллекцию:

public class TripleCollection<T> : IEnumerable<Tuple<T, T, T>> 
{ 
    readonly List<Tuple<T, T, T>> list = new List<Tuple<T, T, T>>(); 

    public void Add(T first, T second, T third) 
    { 
     list.Add(Tuple.Create(first, second, third)); 
    } 

    public IEnumerator<Tuple<T, T, T>> GetEnumerator() 
    { 
     return list.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

Ниже будет успешно компилировать и создать коллекцию с одной 3-кортежем:

 var tuples = new TripleCollection<string> 
     { 
      { "1", "2", "3" }, 
     }; 

Вы также можете сделать следующее List подкласса:

public class ListOfArray<T> : List<T[]> 
{ 
    public new void Add(params T[] args) 
    { 
     base.Add(args); 
    } 
} 

И инициализируйте его желаемым синтаксисом:

 var synonyms = new ListOfArray<string> 
     { 
      { "enabled", "enable", "enabling" }, 
      { "disabled", "disable", "disabling" }, 
      { "s0", "s0 state" }, 
      { "s5", "s5 state" } 
     }; 

Но List<string []>, как и другие отметили, что вам нужно инициализировать список синонимов, явно выделяя каждую string [] записи, а не с помощью неявного сбора intializer для каждой записи:

 var synonyms = new List<string[]> 
     { 
      new [] { "enabled", "enable", "enabling" }, 
      new [] { "disabled", "disable", "disabling" }, 
      new [] { "s0", "s0 state" }, 
      new [] { "s5", "s5 state" } 
     }; 
6

Вы должны добавить массив строк

List<string[]> synonyms = new List<string[]> 
    { 
     new string[] { "enabled", "enable", "enabling" }, 
     new string[] { "disabled", "disable", "disabling" }, 
     new string[] { "s0", "s0 state" }, 
     new string[] { "s5", "s5 state" } 
    }; 
6

Создать неявно типизированные массивы для List инициализаторе:

List<string[]> synonyms = new List<string[]> 
{ 
    new [] { "enabled", "enable", "enabling" }, 
    new [] { "disabled", "disable", "disabling" }, 
    new [] { "s0", "s0 state" }, 
    new [] { "s5", "s5 state" } 
}; 

new [] { ... } эквивалентно делать new string[] { ... }, когда типы объектов в массиве - все string. Вы получите ошибку, используя неявный синтаксис, если типы объектов в массиве отличаются.

8

Вы не создаете массивы в вашем примере, попробуйте следующее:

List<string[]> synonyms = new List<string[]> 
    { 
     new[] { "enabled", "enable", "enabling" }, 
     new[] { "disabled", "disable", "disabling" }, 
     new[] { "s0", "s0 state" }, 
     new[] { "s5", "s5 state" } 
    }; 
5

Вы должны указать, что внутренние объекты являются массивами, так что он не ищет многопараметрических Добавить методы.

List<string[]> synonyms = new List<string[]> 
    { 
     new[] { "enabled", "enable", "enabling" }, 
     new[] { "disabled", "disable", "disabling" }, 
     new[] { "s0", "s0 state" }, 
     new[] { "s5", "s5 state" } 
    }; 
1

Я думаю, что, возможно, вы не делаете никаких экземпляров массивов.

 List<string[]> synonyms = new List<string[]> 
    { 
     {new string[] { "enabled", "enable", "enabling" }}, 
     {new string[] { "disabled", "disable", "disabling" }}, 
     {new string[] { "s0", "s0 state" }}, 
     {new string[] { "s5", "s5 state" }} 
    };