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

Sorting List<Struct> items by order of int variable in each struct

下面的结构由三个变量组成,bool visibleint idint 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);
        }
    }
}

我的问题是,如何设置每个 item[=56= 的 order ]在itemListbool visible = true基于setVisible(int id)[=56时=] 被调用。因此,如果 setVisible(1)setVisible(2) 之前被调用,那么 order 第二个会大于第一个,反之亦然。

例如,

setVisible(1);
setVisible(2);

结果:

itemList[0].visible = true, itemList[0].id = 1, itemList[0].order = 1
itemList[1].visible = true, itemList[1].id = 2, itemList[1].order = 2
itemList[2].visible = false, itemList[2].id = 3, itemList[2].order = 0
itemList[3].visible = false, itemList[3].id = 4, itemList[3].order = 0

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

编辑:

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

您是否只是在寻找将可见设置为真时计算下一个订单的函数。

大致如下:

 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 应该只用于查询,所以你不应该用它来改变对象的状态。

上面的代码显然只说明了将可见性设置为真。如果您需要将某个项目的可见性设置为 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));
}

除了你的列表,你可以存储另一个变量,比如 int currentOrder=0; 每次调用 setVisible 时,将该特定项目的顺序设置为

++currentOrder

不能 post 花哨的代码,因为我在 Android 应用程序上。