2013-02-14 138 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?

相关问题