2010-02-02 109 views
3

組成我有以下的數組:排序在C#多維[,]數組,整數

private int[,] testSamples = new testSamples[101,101]; 

它應該代表名冊,其列0至100和行0至100。這個名冊,各種化學液體掉落。我這樣做的人想要以這樣的方式工作,以便他可以首先處理液體最多的容器。

所以,我需要並打印得到這樣的數據:

testSamples[35,40] = 12 
testSamples[11,12] = 11 
testSamples[92,14] = 10 
testSamples[18,3] = 10 
testSamples[1,61] = 7 
... 

例如。 我一直在爲這幾天打破我的頭,我已經看到了StackoverFlow的其他一些問題,但我無法讓他們工作。

有沒有辦法做到這一點,或者我應該放棄數組,並去另一種容器,如ArrayLists或列表項?

回答

1

這裏有一個建議,我認爲最終與Richard的結果非常相似,但是沒有使用LINQ。

編寫一個包含三個值(x,y和value)的快速結構(類似這樣的東西可能已經存在)。就像這樣:

public struct SampleSlot : IComparable<SampleSlot> { 
    public int X; 
    public int Y; 
    public int Value; 

    public SampleSlot(int x, int y, int value) { 
     X = x; 
     Y = y; 
     Value = value; 
    } 

    public int CompareTo(SampleSlot other) { 
     return Value.CompareTo(other.Value); 
    } 
} 

然後即可摺疊int[,]陣列到你喜歡的SampleSlot對象的任何排序的一維集合;我可能會去與List<SampleSlot>

List<SampleSlot> slotsList = new List<SampleSlot>(); 

for (int i = 0; i < testSamples.GetLength(0); ++i) { 
    for (int j = 0; j < testSamples.GetLength(1); ++j) { 
     slotsList.Add(new SampleSlot(i, j, testSamples[i, j])); 
    } 
} 

slotsList.Sort(); 

// assuming you want your output in descending order 
for (int i = slotsList.Count - 1; i >= 0; --i) { 
    SampleSlot slot = slotsList[i]; 
    Console.WriteLine("testSamples[{0},{1}] = {2}", slot.X, slot.Y, slot.Value); 
} 
+0

它可以工作,但計算輸出需要很長時間。 – KdgDev 2010-02-03 07:22:22

+0

解決時間問題:在double for-loop內添加if語句。如果testSamples [i; j]值爲0,則不要添加。 – KdgDev 2010-02-03 08:48:21

2

你可能會更喜歡使用類似OrderedBag的東西。此外,您可能希望讓您的List存儲除了整數之外的其他東西。它看起來像是一個更復雜的邏輯對象,你試圖去表現,比如花名冊,實驗,燒杯等等。

更新:根據有關SortedList的意見進行編輯,以改爲使用OrderedBag。

+0

'SortedList'將要求密鑰是唯一的;我不認爲這可以應用在這種情況下。 – 2010-02-02 15:43:37

+0

好點。更新爲使用OrderedBag代替。 – Nick 2010-02-02 16:02:59

5

你可以這樣做,但你需要一個容器來保存索引的輸出對,一個快速的方法做,這是一個匿名類型和LINQ:

var sorted = from x in Enumerable.Range(0, testSamples.GetLength(0)) 
      from y in Enumerable.Range(0, testSamples.GetLength(1)) 
      select new { 
       X = x, 
       Y = y, 
       Value = testSamples[x,y] 
      } into point 
      orderby point.Value descending 
      select point; 

sorted後的一個IEnumerable匿名類型每個都是來自數組的索引和值。

編輯:將第一最大...

+0

@邁克爾哈倫:好點...會更新。 – Richard 2010-02-02 15:36:45

+0

Hmz,可以將它放入StringBuilder對象嗎? 我的意思是,最終的結果。 – KdgDev 2010-02-03 01:31:49

+0

用StringBuilder,我可以做AppendLine,toString()最終的結果,它可以進入一個文本文件。 對不起,如果我似乎依賴你們有點太多,但我從來沒有使用LINQ或IEnumerable之前。我找不到任何方法將此結果轉換爲字符串。 – KdgDev 2010-02-03 02:06:10

0

假設的3x3:

5 4 3 
2 1 9 
8 7 6 

你可以只存儲與關鍵液體大小在SortedDictionary座標,座標值:

key - value 
9 - [2,1] 
8 - [0,3] 
... 
+0

適用於排序閱讀,但不適用於編寫新的液體數量來協調x,y。 – 2010-02-02 16:11:18