2009-03-20 2 views
73

多次元リストを設定したいと思います。 参考までに、私はプレイリストアナラ​​イザを使っています。2次元リストはC#で可能ですか?

私のプログラムが標準リストに保存するファイル/ファイルリストがあります。各リスト項目のファイルから1行。

次に、正規表現でリストを分析して特定の行を見つけます。 行のデータ/結果の一部を新しい多次元リストに入れる必要があります。結果/データがいくつあるかわからないので、多次元配列を使用することはできません。

 
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]歌1からTrackIDを取得し、mlistう[1ここで

は、私が挿入するデータであります] [0]曲2など

しかし、私は多次元リストを作成する大きな問題を抱えています。 これまでのところ、私は

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

が出ている。しかし、私は本当に多くのより多くの進歩を持っていなかった:(

答えて

113

さてあなたは確かにあなたが書きたい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

+0

また、最終的に作成/保存するトラック数を知る必要はありませんか? – CasperT

+2

いいえ。リストはまだ動的サイズです。 1つのトラックのデータを解析し、トラックの新しいインスタンスを作成し、リストに追加してから次のデータを解析します。 –

89

Jon Skeetと言えば、代わりにList<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>としてトラックリストを作成する:トラッククラスは、このようになります

trackList.add(new Track { 
    TrackID = 1234, 
    Name = "I'm Gonna Be (500 Miles)", 
    Artist = "The Proclaimers", 
    Album = "Finest", 
    PlayCount = 10, 
    SkipCount = 1 
}); 

var trackList = new List<Track>(); 

追加するトラックは、このような単純なことができを

インデックス演算子を使用してトラックにアクセスすることができます。

Track firstTrack = trackList[0]; 

希望します。

+4

あなたが本当に精通したい場合は、トラックも構造体になる可能性があります。 ;) – Spoike

+3

あなたが与えた定義ではありません...構造体は16バイト未満のインスタンスサイズを持つ必要があります... – Ian

+1

デモのおかげで! – CasperT

11

私が使用しているの周りに別の仕事...私が働いているライブラリーは非常にフォーマルなクラス構造を持っている

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

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

だったと私はのために効果的にそこに余分なものをwan'tしませんでした2つの「関連する」intを記録する特権。

2つのアイテム配列だけを入力するプログラマに依存しますが、共通アイテムではないと思います。

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 
+0

これは私のために役立ちます!ありがとうございました! –

0

あなたはまた、DataTableを使用することができます - あなたがして、列の数とその型を定義し、行 http://www.dotnetperls.com/datatable

+0

'List 'アプローチに忠実に従い、 'BindingSource'を使用します。単純にDataSourceを' Track'型の 'DataGridView'に追加して、強く型付けされたクラスをコードでサポートし、トラック内のトラックの視覚化を容易にします。データグリッドビュー。 – Oliver

+0

合意しましたが、データを瞬時に表示したくない場合があり、既存のソリューションを使用することを好むように、1つの場所でのみ使用するためにもう1つのクラスを作成したくない場合もあります。 ...ちょうどこれを解決するもう一つの方法を指摘したい! ;) – Val

28
を追加することができます

これは私が見つけた最も簡単な方法です。値を取得するために

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 
+3

トラッククラスについての以前の提案はOPの要件に最適でしたが、このソリューションは2次元グリッドのオブジェクトを作成するのに最適なソリューションです。ありがとう! – CigarDoug

+1

ええ、これは私が最もシンプルでエレガントなソリューションであることがわかったので、私は助けてくれてうれしいです! –

+1

シンプルで便利です!ありがとうございました! –

0

あるループ内のリストを生成する// 2次元のリストを作成する方法

です。 リスト> biglist =新しいリスト>();

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

入力されていない場所にアクセスする危険性に注意してください。

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); 

をalso..doすることができ、

Child=new List<Object>(); 
child.Add(2323); 
child.Add("asds"); 
child.Add("jshds"); 
. 
. 
Parent.Add(child); 
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); 
     } 
    } 
} 
関連する問題