Подтвердить что ты не робот

Создание списка списков в С#

Кажется, у меня возникли проблемы, обертывая вокруг идеи общего списка общих списков на С#. Я думаю, что проблема связана с использованием аргумента <T>, с которым у меня нет предшествующего опыта. Может ли кто-нибудь предоставить короткий пример объявления класса, который является списком, в котором содержится другой список, но где тип объекта, содержащегося в нем, не сразу известен?

Я читал документацию MS по Generics, и я не сразу уверен, могу ли я объявить List<List<T>>, и как точно передать параметр <T> во внутренний список.

Изменить: добавление информации

Объявлял бы List<List<T>> законным здесь? В случае, если вам интересно, я создаю класс, который позволяет мне использовать ulong в качестве индексатора и (надеюсь) шагает вокруг неприятного 2GB-предела .Net, сохраняя список списков.

public class DynamicList64<T>
    {
        private List<List<T>> data = new List<List<T>>();

        private ulong capacity = 0;
        private const int maxnumberofitemsperlist = Int32.MaxValue;



        public DynamicList64()
        {
            data = new List<List<T>>();
        } 
4b9b3361

Ответ 1

Быстрый пример:

List<List<string>> myList = new List<List<string>>();
myList.Add(new List<string> { "a", "b" });
myList.Add(new List<string> { "c", "d", "e" });
myList.Add(new List<string> { "qwerty", "asdf", "zxcv" });
myList.Add(new List<string> { "a", "b" });

// To iterate over it.
foreach (List<string> subList in myList)
{
    foreach (string item in subList)
    {
        Console.WriteLine(item);
    }
}

Это то, что вы искали? Или вы пытаетесь создать новый class, который расширяет List<T>, который имеет член, который является "List"?

Ответ 2

или этот пример, чтобы сделать его более заметным:

public class CustomerListList : List<CustomerList> { }  

public class CustomerList : List<Customer> { }

public class Customer
{
   public int ID { get; set; }
   public string SomethingWithText { get; set; }
}

и вы можете продолжать это делать. к бесконечности и дальше!

Ответ 3

public class ListOfLists<T> : List<List<T>>
{
}


var myList = new ListOfLists<string>();

Ответ 4

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

Реализация

//InfiniteList<T> is a list of itself...
public class InfiniteList<T> : List<InfiniteList<T>>
{
    //This is necessary to allow your lists to store values (of type T).
    public T Value { set; get; }
}

T является типичным параметром типа. Это необходимо для обеспечения безопасности типа в вашем классе. Когда вы создаете экземпляр InfiniteList, вы заменяете T типом, в который должен быть заполнен ваш список, или в этом случае тип свойства Value.

Пример

//The InfiniteList.Value property will be of type string
InfiniteList<string> list = new InfiniteList<string>();

"Рабочий" пример этого, где T сам по себе, Список строк типа!

//Create an instance of InfiniteList where T is List<string>
InfiniteList<List<string>> list = new InfiniteList<List<string>>();

//Add a new instance of InfiniteList<List<string>> to "list" instance.
list.Add(new InfiniteList<List<string>>());

//access the first element of "list". Access the Value property, and add a new string to it.
list[0].Value.Add("Hello World");

Ответ 5

вам не следует использовать Вложенный список в списке.

List<List<T>> 

не является законным, даже если T является определенным типом.

https://msdn.microsoft.com/en-us/library/ms182144.aspx