按照每个结构</struct>中的int变量的顺序对List <struct>项进行排序

时间:2015-03-05 23:20:47

标签: c# .net linq list struct

下面的结构包含三个变量, bool visible int id int order

List<Data.myStruct> itemList = new List<Data.myStruct>();

然后我在列表中添加了四个项目

itemList.Add(new Data.myStruct(false, 1, 0));
itemList.Add(new Data.myStruct(false, 2, 0));
itemList.Add(new Data.myStruct(false, 3, 0));
itemList.Add(new Data.myStruct(false, 4, 0));

我可以创建一个函数来将给定id的可见性设置为true。

public void setVisible(int id) {
    for(int i = 0; i < itemList.Count; i++)
    {
        if(id == itemList[i].id)
        {
            itemList[i] = new Data.myStruct(true, itemList[i].id, itemList[i].order);
        }
    }
}

我的问题是,如何在 {{中设置每个 order item 1}} 根据 itemList 的时间调用 bool visible = true 。因此,如果在 setVisible(int id) 之前调用 setVisible(1) ,则第二个 setVisible(2) 会更强比第一个,反之亦然。

例如,

order

结果:

setVisible(1);
setVisible(2);

如果我要在其中一个上将可见性更改为false,我如何更改顺序以填补空白。可以使用linq完成吗?

编辑:

我如何能够按最高订单价值的顺序遍历列表?

2 个答案:

答案 0 :(得分:1)

您是否只是在设置可见为真时计算下一个订单的功能。

有些事情:

 public void setVisible(int id, List<Data.myStruct> itemList)
 {
     Func<List<Data.myStruct>, int> getNextOrder = list =>
     {
         if (itemList.Any(item => item.order > 0))
             return itemList.Max(item => item.order) - 1;

         return itemList.Count - 1;
     }; 

     for (int i = 0; i < itemList.Count; i++)
     {
         if (id == itemList[i].id && !itemList[i].visible)
         {
             itemList[i] = new Data.myStruct(true, itemList[i].id, getNextOrder(itemList));
         }
     }
 }

您还提到过是否可以使用LINQ来更新订单。 LINQ应该只用于查询,所以你永远不应该使用它来改变对象的状态。

上面的代码显然只考虑将可见性设置为true。如果您需要将项目的可见性设置为false,则应使用foreach循环来更新其他订单。

修改

根据您问题的修订,以下代码会将可见项目设置为最高顺序,然后重新排序其他项目:

public static void setVisible(int id, List<Data.myStruct> itemList)
{
    int previousOrder = int.MinValue;

    for (int i = 0; i < itemList.Count; i++)
    {
        if (id == itemList[i].id)
        {
            previousOrder = itemList[i].order;
            itemList[i] = new Data.myStruct(true, itemList[i].id, itemList.Count - 1);
        }
    }

    if (previousOrder == int.MinValue)
        return;

    for (int i = 0; i < itemList.Count; i++)
    {
        if (itemList[i].id != id && itemList[i].order > 0 && itemList[i].order >= previousOrder)
        {
            var order = itemList[i].order - 1;
            itemList[i] = new Data.myStruct(true, itemList[i].id, order);
        }
    }
}

将值输出到控制台:

foreach (var item in itemList.OrderByDescending(i => i.order))
{
    Console.WriteLine(string.Format("{0} - {1} - {2}", item.id, item.visible, item.order));
}

答案 1 :(得分:0)

在列表旁边,您可以存储另一个变量,例如int currentOrder=0; 每次执行setVisible调用时,请将该特定项的顺序设置为

++currentOrder

无法发布花哨的代码,因为我在Android应用上。