下面的结构包含三个变量, 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完成吗?
编辑:
我如何能够按最高订单价值的顺序遍历列表?
答案 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应用上。