C #에서 2 차원 목록이 가능합니까?


89

다차원 목록을 설정하고 싶습니다. 참고로 재생 목록 분석기 작업 중입니다.

내 프로그램이 표준 목록에 저장하는 파일 / 파일 목록이 있습니다. 각 목록 항목의 파일에서 한 줄.

그런 다음 정규식으로 목록을 분석하여 특정 줄을 찾습니다. 라인의 일부 데이터 / 결과는 새로운 다차원 목록에 넣어야 합니다. 얼마나 많은 결과 / 데이터로 끝날지 모르기 때문에 다차원 배열을 사용할 수 없습니다.

삽입하려는 데이터는 다음과 같습니다.

명부
(
    [0] => 목록
        (
            [0] => 트랙 ID
            [1] => 이름
            [2] => 아티스트
            [3] => 앨범
            [4] => 플레이 횟수
            [5] => 스킵 카운트

        )
    [1] => 목록
        (
등등....

실제 예 :

명부
(
    [0] => 목록
        (
            [0] => 2349
            [1] => 삶의 황금기
            [2] => 멍청한 펑크
            [3] => 결국 인간
            [4] => 3
            [5] => 2

        )
    [1] => 목록
        (

예, mlist [0] [0]은 노래 1에서 TrackID를, 노래 2에서 mlist [1] [0]을 가져옵니다.

하지만 다차원 목록을 만드는 데 큰 문제가 있습니다. 지금까지 나는

List<List<string>> matrix = new List<List<string>>();

그러나 나는 정말로 더 많은 진전이 없었습니다 :(

답변:


137

다음과 같이 작성할 위치 를 확실히 사용할 수 있습니다 List<List<string>>.

List<string> track = new List<string>();
track.Add("2349");
track.Add("The Prime Time of Your Life");
// etc
matrix.Add(track);

하지만 트랙 ID, 이름, 아티스트, 앨범, 재생 횟수 및 건너 뛰기 횟수 속성을 사용하여 트랙을 나타내는 자체 클래스를 만드는 대신 왜 그렇게할까요? 그런 다음 List<Track>.


1
흠, 솔직히 어떻게해야할지 모르겠네요! 재생 목록 처리를위한 클래스 설정 만 살펴 봤지만 그게 더 나은 생각이라고 생각합니다.
CasperT

또한 최종적으로 생성 / 저장할 트랙 수를 알아야하지 않습니까?
CasperT

2
아니요, List <Track>은 여전히 ​​동적 크기이기 때문입니다. 한 트랙에 대한 데이터를 구문 분석하고, Track의 새 인스턴스를 만들고, List <Track>에 추가 한 다음 다음 항목을 구문 분석하는 등의 작업을 수행합니다.
Jon Skeet

caspert, List <T>는 저장하는 개체의 양을 추적합니다. 당신은 목록 <T> .Count 호출하여 양에 액세스 할 수 있습니다
Spoike

3
@CasperT 많은 사람들이 제안한 것을 수행하고 Track 수업을 . 코드를 이해 / 유지하는 것이 훨씬 쉬울 것입니다. 트랙을 문자열 목록으로 표시하는 경우 특정 속성을 저장하는 indeces는 트랙 정보에 액세스하려는 모든 인스턴스 에서 동기화되어야합니다 . 매번 구현하는 것이 지루해지고 디버깅이 불가능 해집니다. 여러분을 위해서 수업을 살펴보세요. :)
Alexander Kondratskiy 2011

103

존 소총은 당신이 함께 할 수있는 언급 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];

도움이 되었기를 바랍니다.


4
정말 잘 알고 싶다면 Track이 구조체가 될 수도 있습니다. ;)
Spoike

3
지정한 정의가 아닙니다 ... 구조체의 인스턴스 크기는 16 바이트 미만이어야합니다 ...
Ian

@Ian : 흠. 나는 그것을 몰랐다. 신속하게 MSDN 문서를 확인한 결과 구조체는 16 바이트 미만이어야합니다. 지적 해 주셔서 감사합니다.
Spoike

14
그럴 필요 는 없습니다 . 단지 추천 일뿐입니다. 그다지 중요하지 않습니다. 값 의미론이 필요하면 구조체를 선택하고 그렇지 않으면 클래스 만 선택하십시오. 모르는 경우 수업을 사용하십시오.
jason

@Spoike : 루프를 반복하는 동안 일부 행에있는 데이터를 추가하려는 경우 2 for 루프 내부의 목록을 사용하는 방법. 예 :for(i=0;i< length; i++) { for(j=0;j<length2;j++) {// what should be written here to get the values from a 2d array // to this 2d list } }
Sandeep

35

이것이 내가 찾은 가장 쉬운 방법입니다.

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
Track 클래스에 대한 이전 제안이 OP의 요구 사항에 가장 적합했지만이 솔루션은 2 차원 개체 그리드를 구축하는 데 가장 적합한 솔루션입니다. 감사!
CigarDoug 2014

2
예, 이것이 제가 가장 간단하고 우아한 솔루션이라는 것을 알게 된 것입니다. 도와 주셔서 기쁩니다!
Jordan LaPrise 2014

1
간단하고 유용합니다! 감사합니다!
Dov Miller

12

내가 사용한 또 다른 작업은 ...

List<int []> itemIDs = new List<int[]>();

itemIDs.Add( new int[2] { 101, 202 } );

내가 작업중인 라이브러리는 매우 형식적인 클래스 구조를 가지고 있으며 두 개의 '관련된'int를 기록하는 특권을 위해 효과적으로 거기에 추가 항목을 원하지 않았습니다.

프로그래머가 2 항목 배열 만 입력하는 데 의존하지만 일반적인 항목이 아니기 때문에 작동한다고 생각합니다.


2

이 방법으로도 할 수 있습니다.

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=new List<Object>();
child.Add(2323);
child.Add("asds");
child.Add("jshds");
.
.
Parent.Add(child);

2

2 차원 목록을 만드는 방법은 다음과 같습니다.

        // 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";

사람이 많지 않은 위치에 액세스 할 수있는 위험에 유의하십시오.


1

나는 다음을 사용했다 :

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

이것은 저에게 도움이됩니다! 감사합니다!
Dov Miller

0

DataTable을 사용할 수도 있습니다. 그런 다음 열 수와 유형을 정의한 다음 행을 추가 할 수 있습니다. http://www.dotnetperls.com/datatable


코드에서 강력한 형식의 클래스를 지원하고 데이터 그리드보기 내에서 트랙의 시각화를 쉽게 구성 할 수 있도록 해당 형식 에 DataSource를 추가하기 만하면 List<Track>접근 방식을 고수 하고를 사용하는 BindingSource것이 좋습니다. DataGridViewTrack
Oliver

동의하지만 때로는 데이터를 즉시 표시하고 싶지 않고 한곳에서만 사용하기 위해 클래스를 하나 더 만들고 싶지 않으므로 기존 솔루션을 사용하는 것을 선호합니다. ...이 문제를 해결할 수있는 또 다른 방법을 지적하고 싶었습니다! ;)
Val

0

여기 제가 작업하던 게임 엔진을 위해 얼마 전에 만든 것이 있습니다. 로컬 개체 변수 홀더로 사용되었습니다. 기본적으로 일반 목록으로 사용하지만 문자열 이름 (또는 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);
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.