Возможны ли 2-мерные списки в С#?
Я бы хотел создать многомерный список.
Для справки, я работаю над анализатором плейлистов.
У меня есть файл/файл-список, который моя программа сохраняет в стандартном списке. Одна строка из файла в каждой записи списка.
Затем я анализирую список с регулярными выражениями, чтобы найти определенные строки.
Некоторые данные/результаты из строк должны быть помещены в новый многомерный список; так как я не знаю, сколько результатов/данных у меня получится, я не могу использовать многомерный массив.
Вот данные, которые я хочу вставить:
List
(
[0] => List
(
[0] => Track ID
[1] => Name
[2] => Artist
[3] => Album
[4] => Play Count
[5] => Skip Count
)
[1] => List
(
And so on....
Реальный пример:
List
(
[0] => List
(
[0] => 2349
[1] => The Prime Time of Your Life
[2] => Daft Punk
[3] => Human After All
[4] => 3
[5] => 2
)
[1] => List
(
Итак, mlist [0] [0] получит TrackID из песни 1, mlist [1] [0] из песни 2 и т.д.
Но у меня возникают огромные проблемы, создающие многомерный список.
До сих пор я придумал
List<List<string>> matrix = new List<List<string>>();
Но у меня не было особого прогресса: (
Ответы
Ответ 1
Ну, конечно, вы можете использовать List<List<string>>
, где вы тогда пишете:
List<string> track = new List<string>();
track.Add("2349");
track.Add("The Prime Time of Your Life");
// etc
matrix.Add(track);
Но зачем вам это делать вместо того, чтобы создавать собственный класс для представления дорожки, с характеристиками Track ID, Name, Artist, Album, Play Count и Skip Count? Тогда просто .
Ответ 2
Как Jon Skeet упомянул, что вы можете сделать это с помощью List<Track>
. Класс Track будет выглядеть примерно так:
public class Track {
public int TrackID { get; set; }
public string Name { get; set; }
public string Artist { get; set; }
public string Album { get; set; }
public int PlayCount { get; set; }
public int SkipCount { get; set; }
}
И чтобы создать список треков как List<Track>
, вы просто делаете это:
var trackList = new List<Track>();
Добавление треков может быть таким же простым, как это:
trackList.add( new Track {
TrackID = 1234,
Name = "I'm Gonna Be (500 Miles)",
Artist = "The Proclaimers",
Album = "Finest",
PlayCount = 10,
SkipCount = 1
});
Доступ к трекам может выполняться с помощью оператора индексирования:
Track firstTrack = trackList[0];
Надеюсь, что это поможет.
Ответ 3
Это самый простой способ, который я нашел для этого.
List<List<String>> matrix= new List<List<String>>(); //Creates new nested List
matrix.Add(new List<String>()); //Adds new sub List
matrix[0].Add("2349"); //Add values to the sub List at index 0
matrix[0].Add("The Prime of Your Life");
matrix[0].Add("Daft Punk");
matrix[0].Add("Human After All");
matrix[0].Add("3");
matrix[0].Add("2");
Получить значения еще проще
string title = matrix[0][1]; //Retrieve value at index 1 from sub List at index 0
Ответ 4
Другая работа, вокруг которой я пользовалась, была...
List<int []> itemIDs = new List<int[]>();
itemIDs.Add( new int[2] { 101, 202 } );
Библиотека, над которой я работаю, имеет очень формальную структуру классов, и я не делал там лишних вещей для привилегии записи двух "родственных" цепей.
Опирается на программиста, который вводит только массив из 2 элементов, но поскольку это не общий элемент, я думаю, что он работает.
Ответ 5
Вот как сделать двухмерный список
// Generating lists in a loop.
List<List<string>> biglist = new List<List<string>>();
for(int i = 1; i <= 10; i++)
{
List<string> list1 = new List<string>();
biglist.Add(list1);
}
// Populating the lists
for (int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
biglist[i].Add((i).ToString() + " " + j.ToString());
}
}
textbox1.Text = biglist[5][9] + "\n";
Помните об опасности доступа к месту, которое не заселено.
Ответ 6
Вы также можете... так,
List<List<Object>> Parent=new List<List<Object>>();
List<Object> Child=new List<Object>();
child.Add(2349);
child.Add("Daft Punk");
child.Add("Human");
.
.
Parent.Add(child);
если вам нужен другой элемент (ребенок),
создайте новый экземпляр child,
Child=new List<Object>();
child.Add(2323);
child.Add("asds");
child.Add("jshds");
.
.
Parent.Add(child);
Ответ 7
Я использовал:
List<List<String>> List1 = new List<List<String>>
var List<int> = new List<int>();
List.add("Test");
List.add("Test2");
List1.add(List);
var List<int> = new List<int>();
List.add("Test3");
List1.add(List);
что равно:
List1
(
[0] => List2 // List1[0][x]
(
[0] => Test // List[0][0] etc.
[1] => Test2
)
[1] => List2
(
[0] => Test3
Ответ 8
Вы также можете использовать DataTable - вы можете определить количество столбцов и их типы, а затем добавить строки
http://www.dotnetperls.com/datatable
Ответ 9
Вот кое-что, что я сделал некоторое время назад для игрового движка, над которым я работал. Он использовался как владелец локального объекта. В основном, вы используете его как обычный список, но он содержит значение в позиции того, что когда-либо было именем строки (или ID). Немного модификации, и у вас будет свой 2D-список.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GameEngineInterpreter
{
public class VariableList<T>
{
private List<string> list1;
private List<T> list2;
/// <summary>
/// Initialize a new Variable List
/// </summary>
public VariableList()
{
list1 = new List<string>();
list2 = new List<T>();
}
/// <summary>
/// Set the value of a variable. If the variable does not exist, then it is created
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
/// <param name="value">The value of the variable</param>
public void Set(string variable, T value)
{
if (!list1.Contains(variable))
{
list1.Add(variable);
list2.Add(value);
}
else
{
list2[list1.IndexOf(variable)] = value;
}
}
/// <summary>
/// Remove the variable if it exists
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
public void Remove(string variable)
{
if (list1.Contains(variable))
{
list2.RemoveAt(list1.IndexOf(variable));
list1.RemoveAt(list1.IndexOf(variable));
}
}
/// <summary>
/// Clears the variable list
/// </summary>
public void Clear()
{
list1.Clear();
list2.Clear();
}
/// <summary>
/// Get the value of the variable if it exists
/// </summary>
/// <param name="variable">Name or ID of the variable</param>
/// <returns>Value</returns>
public T Get(string variable)
{
if (list1.Contains(variable))
{
return (list2[list1.IndexOf(variable)]);
}
else
{
return default(T);
}
}
/// <summary>
/// Get a string list of all the variables
/// </summary>
/// <returns>List string</string></returns>
public List<string> GetList()
{
return (list1);
}
}
}