2013-07-09 67 views
0

我想要一個可以保存Integer和Char的數據類型。保存多個數據的數據類型

private Int32[] XCordinates = {0,1,2,3,4,5,6,7,8,9 }; 
private Char[] yCordinates = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' }; 

,我想結果是這樣,我應該用最快的性能和數據檢索來自比方說「H6」進入這個

A0 
A1 
A2 
A3 
A4 and so on.... upto 
J8 
J9 

現在的數據類型。

  1. 詞典是出方程,因爲他們不允許多個鍵

    可以用來
  2. 的ArrayList,但它只能存儲一個類型的對象和需要裝箱/拆箱。

或者我可以使用

List<KeyValuePair<Char, Int32>> myKVPList = new List<KeyValuePair<Char, Int32>>(); 
foreach (Char yValue in yCordinates) 
{ 
    foreach (Int32 xValue in XCordinates) 
    { 
     myKVPList.Add(new KeyValuePair<Char, Int32>(yValue, xValue)); 
    } 
} 

但名單是最慢的訪問數據相比,數組,有什麼建議?

+0

'名單 ' – Sayse

+0

我不完全明白你想解決什麼問題,但是不會有一個「可以容納Integer和Char的數據類型」在技術上是:'public struct MyXY {public char X; public int Y; public override string ToString(){return X + Y.ToString(); }}'?然後你可以有一個類似'var a = new MyXY [length]'的數組。 – Corak

+0

我拒絕你的前提,列表訪問數據的速度比數組慢。他們不是,至少沒有任何有意義的數量。這種差異幾乎肯定不足以成爲您程序中的問題。 – Servy

回答

1

.NET Framework 3.5包含一個特殊的LINQ Lookup類。

var lookup = (from x in yCordinates 
      from y in XCordinates 
      select new{x, y}).ToLookup(xy => xy.x, xy => xy.y); 

foreach(var xy in lookup) 
    Console.WriteLine("x:{0} y-values:{1}", xy.Key, string.Join(",", xy.Select(y => y))); 

結果:

x:A y-values:0,1,2,3,4,5,6,7,8,9 
x:B y-values:0,1,2,3,4,5,6,7,8,9 
x:C y-values:0,1,2,3,4,5,6,7,8,9 
x:D y-values:0,1,2,3,4,5,6,7,8,9 
x:E y-values:0,1,2,3,4,5,6,7,8,9 
x:F y-values:0,1,2,3,4,5,6,7,8,9 
x:G y-values:0,1,2,3,4,5,6,7,8,9 
x:H y-values:0,1,2,3,4,5,6,7,8,9 
x:I y-values:0,1,2,3,4,5,6,7,8,9 
x:J y-values:0,1,2,3,4,5,6,7,8,9 

Lookup<TKey, TElement>類似於Dictionary<TKey, TValue>。區別在於Dictionary<TKey, TValue>將鍵映射到單個值,而Lookup<TKey, TElement>將鍵映射到值集合。

它的缺點是:

  • 你不能只創建一個查詢對象,因爲沒有公共的構造,其僅提供使用.ToLookup方法
  • 你不能編輯它一旦被創建,無添加或刪除等。

作爲一個附註,您可以查詢(通過索引器)一個不存在的關鍵字,並且您將獲得一個空序列。對字典做同樣的事情,你會得到一個異常。

+0

謝謝@Tim,這種查找解決了我的問題,但是這種查找是什麼類型的變量?如果我這樣做... 查找 lookup =(從x在y座標 從y座標X座標 選擇新的{x,y})ToLookup(xy => xy.x,xy => xy.y); 它給我一個錯誤,無法隱式轉換類型'System.Linq.ILookup '到'System.Linq.Lookup '。一個明確的轉換存在(你是否缺少演員?)\t 其實我必須從另一個函數返回這個「lookup」,所以我希望它使它成爲一個成員字段。 – Pankaj

+0

@潘卡:這是一個'ILookup '。類型'Lookup '實現'ToLookup'返回的'ILookup '接口。我會建議使用'var'關鍵字。 –

0

你可以嘗試字符和數字的字節表示,則FORMATT他們:

 //values from 48-57 are 0 to 9,65-90 uppercase letters,97-122 lowercase letters 
     byte[] ba = new byte[] { 65, 49, 70, 52, 88, 55 }; 

     for (int i = 0; i < ba.Length; i += 2) 
     { 
      Console.WriteLine(string.Format("{0}{1}",(char)ba[i],(char)ba[i + 1])); 
     } 

     Console.ReadKey(); 

如果你真的不想使用字典,你也可以嘗試只是字符串表示:

  string[] vals = new string[] { "A122", "C67", "T8" }; 
      foreach (var item in vals) 
      { 
       //this is just to show you can convert to an int because if its 
       //one letter and numbers you know index 1 of string will be 
       //the start of the number representation. 
       int count = int.Parse(item.Substring(1, item.Length - 1)); 
       Console.WriteLine("{0},{1}", item.Substring(0, 1), item.Substring(1, item.Length - 1)); 
      }