Объявление Анонимного Списка типов [дубликат]

74
задан Luke Girvin 26 June 2019 в 14:17
поделиться

6 ответов

Это требует небольшого взлома, но это возможно.

static List<T> CreateListFromSingle<T>(T value) {
  var list = new List<T>();
  list.Add(value);
  return list;
}

var list = CreateListFromSingle(
   new{Name="Krishna", 
                 Phones = new[] {"555-555-5555", "666-666-6666"}}
                );
61
ответ дан 24 November 2019 в 11:46
поделиться

Я не думаю, что это возможно. Может быть, в C # 4 используется ключевое слово dynamic?

2
ответ дан 24 November 2019 в 11:46
поделиться

Вы можете составить подобный список, но вам снова придется прибегнуть к серьезной халтуре и использовать некоторые ситуации "типа на примере". For example:

// create the first list by using a specific "template" type.
var list = new [] { new { Name="", Phones=new[] { "" } } }.ToList();

// clear the list.  The first element was just an example.
list.Clear();

// start adding "actual" values.
list.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } });
53
ответ дан 24 November 2019 в 11:46
поделиться

Я бы сказал, если вы хотите избежать возможных головных болей, делайте это на Java и учите Python дома, пытаясь заново создать приложение, подобное тому, которое вы делаете на работе, если вы хотите что-то, что чувствует себя реальным. Вполне вероятно, что если вы знакомы с Python, вы все равно воспользуетесь его возможностями. Однажды я взглянул на первое приложение Python, которое я сделал, и это выглядело так, как будто я написал приложение Object Pascal в синтаксисе Python

-121--2661041-

Всего перезаписано (впервые взломав неправильное дерево).

Уровень изоляции SERIALIZABLE захватывает слот в списке заинтересованных транзакций. Если Oracle не может получить слот, он бросает ORA-8177. Количество доступных слотов ITL контролируется INITRANS и MAXTRANS. Согласно документации :

Для использования сериализуемого режима INITRANS должно быть задано значение не менее 3.

Это значение должно быть задано как для таблицы, так и для ее индексов. Итак, каковы ваши настройки INITRANS? Конечно, в примере кода используется значение по умолчанию (1 для таблиц, 2 для индексов).

-121--2564629-

Обычно для создания экземпляров любого универсального типа, параметризованного анонимным типом для аргумента типа, можно использовать (возможно, плохо пахнущий) трюк, упомянутый другими. Однако для List < T > существует несколько менее грубый способ сделать это:

var array = new[] {
  new {  
    Name="Krishna",  
    Phones = new[] {"555-555-5555", "666-666-6666"}
  }
};
var list = array.ToList();

Ваш эскиз предлагаемого синтаксиса похож на функцию, которую мы не реализовали для C # 3 или 4, но мы рассмотрели. Мы называем функцию «типы бормотания», и она может быть примерно такой:

List<?> myList = new List<?>() {
  new {  
    Name="Krishna",  
    Phones = new[] {"555-555-5555", "666-666-6666"}
  }
};

Мы называем его «типы бормотания», потому что вы, конечно, читаете его «myList - это новый список hrmmf».:-)

Идея состоит в том, что компилятор будет смотреть на инициализаторы и делать все возможное, чтобы выяснить, каким может быть тип, точно так же, как «var» означает «смотреть на инициализатор и выяснить, что тип переменной». Будем ли мы использовать «var» как «бормотание» или «?» (что аналогично тому, что делает Java в связанной функции), или что-то еще является открытым вопросом.

В любом случае, я бы не задержал дыхание в ожидании этой функции на вашем месте. Он пока не сделал сокращения для нескольких языковых версий, но он будет оставаться в списке возможностей еще некоторое время, я думаю. Если гипотетически говорить, мы должны были разрабатывать будущие версии языка. Какой мы можем быть или не быть. Помните, что мысли Эрика о будущих версиях C # предназначены только для развлечений.

26
ответ дан 24 November 2019 в 11:46
поделиться

Вы не можете создать коллекцию анонимного типа таким образом.

Если вам нужно сделать это, вам нужно либо использовать List, либо создать собственный класс или struct для вашего типа.


Edit:

Я перефразирую:

Хотя технически возможно сделать список анонимного типа, я бы настоятельно рекомендовал никогда этого не делать. Практически всегда есть лучший подход, так как, делая это, вы просто создаете код, который практически невозможно поддерживать в рабочем состоянии. Я настоятельно рекомендую сделать пользовательский тип для хранения ваших значений вместо использования анонимных типов.

Пользовательский тип будет обладать всеми теми же возможностями (поскольку анонимные типы определяются компилятором во время компиляции), но будет гораздо более понятен разработчику, который последует за вами...


И просто чтобы поиграть, вот моя запись для "кода, который я никогда не захочу использовать в реальном мире":

var customer = new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } };
var someVariable = new[]{1}.Select(i => customer).ToList();
15
ответ дан 24 November 2019 в 11:46
поделиться

Я потратил довольно много времени, пытаясь найти способ сэкономить себе время, используя список анонимных типов, а затем понял, что, вероятно, быстрее было бы просто использовать частный класс внутри текущего класса...

private class Lookup {
    public int Index;
    public string DocType;
    public string Text;
}
private void MyMethod() {
    List<Lookup> all_lookups = new List<Lookup> {
        new Lookup() {Index=4, DocType="SuperView", Text="SuperView XML File"},
        new Lookup() {Index=2, DocType="Word", Text="Microsoft Word Document"}
    };
    // Use my all_lookups variable here...

}
9
ответ дан 24 November 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: