2013-02-14 137 views
2

我正在研究一個算法,它將解決我遇到的一個問題,但是我發現自己有點卡住了。這裏是場景:基於變量變化對對象進行排序和更新

我有一個對象,其中包含一個變量稱爲秩序。

public class Item 
{ 
    public int Order{get; set;}; 

    public int ID{get; set;}; // not incremented can be any value! 
} 

所以我有這些列表:

List<Item> list = new List<Item>().OrderBy((o) => o.Order); 

而且在任何時間順序值可以改變。 因此,如果我想更改第一個項目訂單值,則所有其他訂單值都應相應更新,因此不會有重複項。

for (int i = 0; i <= list .Count - 1; i++) 
{ 
    if (list [i].ID == inputID) 
    { 
     list [i].Order = inputNewPosition; 
    } 
    else 
    { 
     if (list [i].Order < inputNewPosition) 
     { 
      list [i].Order --; 
     } 
     else 
     { 
      list [i].Order ++; 
     } 
    } 
} 

如果我將最後一個項目順序更改爲第一個,這會失敗,因爲這會使第一個項目順序爲0!

任何人都可以幫忙嗎?

感謝

+0

**所以如果我想改變第一個項目的順序值,所有其他順序值應該相應地更新,所以沒有重複**崩潰我的解析器。也許你想重新表述? – thang 2013-02-14 17:58:44

+0

我正在尋求澄清:從我正在閱讀的內容中我收集到5個具有1,2,3,4,5順序屬性的對象,並且您希望能夠將Order = 5的對象更改爲類似order = 3並更改3-> 4並更改4-> 5以騰出空間。我在正確的軌道上嗎? – deepee1 2013-02-14 19:29:48

回答

3

讓我們來看看在你的列表中的一個元素的四種情況(如我們遍歷它們)。如果(爲簡潔起見)我們將old作爲移動舊位置的項目,並將new作爲其新位置,我們對列表中的項目有以下情況(在紙上繪製以清楚表明這一點)。

  1. 目前的產品要移動的一個:直接將它
  2. 當前項目的順序是< new和< old:不要動它
  3. 當前項目的順序是≥new和< old:移動是正確的
  4. 當前項目的順序是≤new和>old:將其向左
  5. 當前項目的順序是>new和>old:不要動它

當我們開始列舉,我們知道那裏的項目要移動將結束(在new),但我們不知道它來自(old) 。但是,當我們從列表的開始開始列舉時,我們知道在每一步中它必須在列表中進一步向下,直到我們已經看到它!所以我們可以使用一個標誌(seen)來說明我們是否已經看到它。所以假的seen意味着< old,而真意味着> = old

bool seen = false; 
for (int i = 0; i < items.Length; i++) 
{ 
    if (items[i].ID == inputID) 
    { 
     items[i].Order = inputNewPosition; 
     seen = true; 
    } 
} 

這個標誌告訴我們當前的項目是否爲> = 。所以現在可以根據這些知識和上述規則開始分流。 (所以new在上述討論是inputNewPosition,我們是否之前或old後,我們代表我們的seen變量)。

bool seen; 
for (int i = 0; i < items.Count; i++) 
{ 
    if (items[i].ID == inputID) // case 1 
    { 
     items[i].Order = inputNewPosition; 
     seen = true; 
    } 
    else if (seen) // cases 4 & 5 
    { 
     if (items[i].Order <= inputNewPosition) // case 4 
     { 
      items[i].Order--; // move it left 
     } 
    } 
    else // case 2 & 3 
    { 
     if (items[i].Order >= inputNewPosition) // case 3 
     { 
      items[i].Order++; // move it right 
     }    
    } 
} 

說了這一切,它可能是簡單的收集上的每個變化排序。默認排序算法應該與幾乎排序的集合相當差。

+0

謝謝你的幫助,很酷的答案 – 2013-02-15 11:59:55

0

你的問題不是很清楚,但對於你的要求,你可能最好在包含Order的對象上做一個事件,並且可能有一個可以監視它的容器對象。不過,我懷疑你可能想重新考慮你的算法,因爲看起來它是一種非常尷尬的方式來處理顯示順序問題。

這就是說,問題的要求是什麼?如果我將項目#2的順序切換到#5,那麼#3會發生什麼?它保持在哪裏,還是應該是#6?

相關問題