none
[C#2008][WinForm] 請問一下,該如何宣告和使用比較好 ? 謝謝 ^_^ RRS feed

  • 問題


  • 請問一下,該如何宣告和使用比較好 ? 謝謝 ^_^

    vendor有兩個字串變數(變數的數量是固定的,都是字串),vendor的數量不固定

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
        public class vendorClass
        {
            public string Name;
            public string Engine;
        }
        public struct vendorStruct
        {
            public string Name;
            public string Engine;
        }
        enum vendorEnum { Name, Engine } ;

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

                string[] vendor_Name;
                //vendor_Name[1] = "Name1";    // 錯誤    使用未指定的區域變數 'vendor_Name'
               
                //----------------------------------

                string[] vendor3 = new string[10];  // 有宣告數量就可正常使用,但是我的數量是不固定的
                vendor3[1] = "Name1";      
               

                //----------------------------------

                vendorStruct[] vendor1;
                //vendor1[1].Name = "Name1";  // 錯誤    使用未指定的區域變數 'vendor1'

                //----------------------------------
                /*
                int[] v;
                v[vendorEnum.Name] = 1;  // 錯誤    名稱 'vendor' 不存在於目前內容中

                vendorClass[] vendor2 = new vendorClass();  // failed
                vendor2[1].Name = "Name1";
                 * */

            }
        }
    }
    2009年6月2日 上午 06:12

解答

  • List<>
    • 已標示為解答 luicst 2009年6月3日 上午 08:01
    2009年6月2日 上午 06:27
  • 您好,您提到 [ 有宣告數量就可正常使用,但是我的數量是不固定 ] 在這種情況下,我會使用 List<T> 的方式下去做

    http://msdn.microsoft.com/zh-tw/library/6sh2ey19.aspx

            public class vendorClass
            {
                public string _Name;
                public string _Engine;
    
                public vendorClass(string Name, string Engine)   
                {            
                    _Name = Name;
                    _Engine = Engine;   
                }
    
                public string Name
                {
                    set { _Name = value; }
                    get { return _Name; }
                }
    
                public string Engine
                {
                    set { _Engine = value; }
                    get { return _Engine; }
                }  
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                List<string> vendor_Name = new List<string>();
                vendor_Name.Add("Name1");
    
                List<vendorClass> vendor2 = new List<vendorClass>();
                vendor2.Add(new vendorClass("Name", "Engine")); 
            }
    • 已標示為解答 luicst 2009年6月3日 上午 08:02
    2009年6月2日 上午 06:38
    版主
  • ?
    用 Array.ReSize 就可以了,幹嘛去模擬 ReDim ?

    若是實值型別或純參考型別且僅有一維線性增加,則選用 List 是滿適合的,混合型別線性增加用 Array 比較快,刪刪加加一般來說還是首推 List 。

    早期在 VB6 中,Collection (List 的一種) 會比 Array 慢四倍,到了 .Net 後,幾乎差不多,就不用勉強綁在陣列上。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 luicst 2009年6月3日 上午 08:02
    2009年6月2日 上午 06:49

所有回覆

  • luicst:
        之前有類似此種陣列宣告的討論 http://social.msdn.microsoft.com/Forums/zh-TW/232/thread/ef1f985f-39d9-4d45-b5d7-ee23bcd4e323

        有一種解法是先宣告一個很大的陣列,再去做類似 VB.NET中 ReDim Preserve的動作,關於這個可以參考以下這篇連結
        http://sam5947.blogspot.com/2008/07/cvbnetredim-preserve.html
    2009年6月2日 上午 06:22
    版主
  • List<>
    • 已標示為解答 luicst 2009年6月3日 上午 08:01
    2009年6月2日 上午 06:27
  • 您好,您提到 [ 有宣告數量就可正常使用,但是我的數量是不固定 ] 在這種情況下,我會使用 List<T> 的方式下去做

    http://msdn.microsoft.com/zh-tw/library/6sh2ey19.aspx

            public class vendorClass
            {
                public string _Name;
                public string _Engine;
    
                public vendorClass(string Name, string Engine)   
                {            
                    _Name = Name;
                    _Engine = Engine;   
                }
    
                public string Name
                {
                    set { _Name = value; }
                    get { return _Name; }
                }
    
                public string Engine
                {
                    set { _Engine = value; }
                    get { return _Engine; }
                }  
            }
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                List<string> vendor_Name = new List<string>();
                vendor_Name.Add("Name1");
    
                List<vendorClass> vendor2 = new List<vendorClass>();
                vendor2.Add(new vendorClass("Name", "Engine")); 
            }
    • 已標示為解答 luicst 2009年6月3日 上午 08:02
    2009年6月2日 上午 06:38
    版主
  • ?
    用 Array.ReSize 就可以了,幹嘛去模擬 ReDim ?

    若是實值型別或純參考型別且僅有一維線性增加,則選用 List 是滿適合的,混合型別線性增加用 Array 比較快,刪刪加加一般來說還是首推 List 。

    早期在 VB6 中,Collection (List 的一種) 會比 Array 慢四倍,到了 .Net 後,幾乎差不多,就不用勉強綁在陣列上。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 luicst 2009年6月3日 上午 08:02
    2009年6月2日 上午 06:49
  • Array 須做 Box,Unbox
    2009年6月2日 上午 07:48
  • 給原發問:

    你還是先去了解什麼是 class, struct 和 enum,再回來看你的問題吧。
    小人物一枚。
    2009年6月2日 上午 08:00
    版主
  • 感謝大家幫忙 ^_^

    小弟後來是 Google 找了些資訊,用 ArrayList 和 struct 擺平

    不過後來有人說 ArrayList 是 .NET 1.x 較合適, .NET 2.x 建議用 List

    現在看了大家回答,似乎也是推薦用 List

    至於 Array Resize, 有人告訴小弟 C# 好像沒有 Array Resize, VB 才有 ??


    ******************** 孔子說:問有三種 不懂則問; 雖懂而有疑惑則問; 雖懂而想更了解則問; ********************
    2009年6月3日 上午 08:01
  • ... 線上手冊也稍微看一下嘛~ .Net 類別庫哪有分語言的...

    Array.Resize
    http://msdn.microsoft.com/zh-tw/library/bb348051.aspx


    C#
    using System;
    
    public class SamplesArray  
    {
        public static void Main()  {
    
            // Create and initialize a new string array.
            String[] myArr = {"The", "quick", "brown", "fox", "jumps", 
                "over", "the", "lazy", "dog"};
    
            // Display the values of the array.
            Console.WriteLine( 
                "The string array initially contains the following values:");
            PrintIndexAndValues(myArr);
    
            // Resize the array to a bigger size (five elements larger).
            Array.Resize(ref myArr, myArr.Length + 5);
    
            // Display the values of the array.
            Console.WriteLine("After resizing to a larger size, ");
            Console.WriteLine("the string array contains the following values:");
            PrintIndexAndValues(myArr);
    
            // Resize the array to a smaller size (four elements).
            Array.Resize(ref myArr, 4);
    
            // Display the values of the array.
            Console.WriteLine("After resizing to a smaller size, ");
            Console.WriteLine("the string array contains the following values:");
            PrintIndexAndValues(myArr);
        }
    
        public static void PrintIndexAndValues(String[] myArr)  {
            for(int i = 0; i < myArr.Length; i++)  
            {
                Console.WriteLine("   [{0}] : {1}", i, myArr[i]);
            }
            Console.WriteLine();
        }
    }
    
    /* 
    This code produces the following output.
    
    The string array initially contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox
       [4] : jumps
       [5] : over
       [6] : the
       [7] : lazy
       [8] : dog
    
    After resizing to a larger size, 
    the string array contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox
       [4] : jumps
       [5] : over
       [6] : the
       [7] : lazy
       [8] : dog
       [9] :
       [10] :
       [11] :
       [12] :
       [13] :
    
    After resizing to a smaller size, 
    the string array contains the following values:
       [0] : The
       [1] : quick
       [2] : brown
       [3] : fox
    
    */
    

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年6月3日 上午 08:06
  • 我的想法是.在效能不會差很多的情形下.程式越簡單越好.能2行Code做出來,就不要去寫3行Code.簡單,明瞭.

    2009年6月3日 上午 08:16