2009-03-20 9 views
73

मैं एक बहुआयामी सूची स्थापित करना चाहता हूं। संदर्भ के लिए, मैं एक प्लेलिस्ट विश्लेषक पर काम कर रहा हूं।सी # में 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] गीत 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); 

लेकिन ट्रैक आईडी, नाम, कलाकार, एल्बम, प्ले गणना और छोड़ें संख्या गुणों के साथ ट्रैक का प्रतिनिधित्व करने के लिए आप अपनी कक्षा बनाने के बजाय ऐसा क्यों करेंगे? तो बस List<Track>

+1

हम्म, मैं ईमानदारी से यह सुनिश्चित नहीं कर रहा हूं कि यह कैसे करें! मैंने अकेले प्लेलिस्ट हैंडलिंग के लिए एक कक्षा की स्थापना की, लेकिन मुझे लगता है कि यह एक बेहतर विचार है। – CasperT

+0

इसके अलावा, क्या यह जानने की आवश्यकता नहीं होगी कि मैं अंततः कितने ट्रैक बनाऊंगा/स्टोर करूंगा? – CasperT

+2

नहीं, क्योंकि सूची अभी भी गतिशील रूप से आकार में है। आप ट्रैक के एक नए उदाहरण को बनाते हैं, ट्रैक का एक नया उदाहरण बनाते हैं, इसे सूची में जोड़ें और फिर अगले एक को पार्स करें, –

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

आपके द्वारा दी गई परिभाषा के साथ नहीं ... स्ट्रक्चर के पास 16bytes से कम का उदाहरण आकार होना चाहिए ... – Ian

+1

प्रदर्शन के लिए धन्यवाद! – CasperT

11

एक और काम जो चारों ओर मैं का इस्तेमाल किया है था ...

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

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

पुस्तकालय मैं पर काम कर रहा हूँ एक बहुत ही औपचारिक वर्ग संरचना है और मैं के लिए प्रभावी रूप से वहाँ में अतिरिक्त सामान wan't नहीं था दो 'संबंधित' इन्ट्स रिकॉर्ड करने का विशेषाधिकार।

प्रोग्रामर पर केवल 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

'सूची ' दृष्टिकोण के लिए बेहतर छड़ी, कोड में दृढ़ता से टाइप किए गए वर्गों का समर्थन करने के लिए 'ट्रैक' प्रकार के अपने 'डेटाग्रिड व्यू' में डेटासोर्स जोड़कर और 'ट्रैकिंग स्रोत' का उपयोग करके, ट्रैक के दृश्यों को कॉन्फ़िगर करने में आसान डेटा ग्रिड व्यू। – Oliver

+0

सहमत हैं, लेकिन कभी-कभी आप तुरंत डेटा प्रदर्शित नहीं करना चाहते हैं और आप केवल एक ही स्थान पर इसका उपयोग करने के लिए एक और कक्षा नहीं बनाना चाहते हैं, इसलिए मैं मौजूदा समाधान का उपयोग करना पसंद करता हूं। ... बस इसे हल करने के लिए एक और तरीका इंगित करना चाहता था! ;) – 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

हालांकि ओपी की आवश्यकता के लिए ट्रैक क्लास के बारे में पहले सुझाव सबसे अच्छा था, फिर भी यह समाधान मेरे लिए दो-आयामी ग्रिड बनाने के लिए सबसे अच्छा है। धन्यवाद! – CigarDoug

+1

हाँ, यही वह है जो मैंने सबसे सरल और सुरुचिपूर्ण समाधान पाया है, खुशी है मैंने मदद की! –

+1

सरल और सहायक! धन्यवाद! –

0

यहाँ कैसे एक 2 आयामी सूची

// एक पाश में सूचियों जनरेट कर रहा है बनाने के लिए है। सूची> biglist = new list>();

 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

आप इस तरह से also..do कर सकते हैं,

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

यहाँ एक छोटे से कुछ है कि मैंने थोड़ी देर पहले एक गेम इंजन के लिए काम किया था जिस पर मैं काम कर रहा था। यह एक स्थानीय ऑब्जेक्ट वेरिएबल धारक के रूप में इस्तेमाल किया गया था। असल में, आप इसे सामान्य सूची के रूप में उपयोग करते हैं, लेकिन यह स्ट्रिंग नाम (या आईडी) की स्थिति में मूल्य रखता है। थोड़ा सा संशोधन, और आपके पास 2 डी सूची होगी।

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); 
     } 
    } 
} 
संबंधित मुद्दे