按每个结构中 int 变量的顺序对 List<Struct> 项进行排序
Sorting List<Struct> items by order of int variable in each 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);
}
}
}
我的问题是,如何设置每个 item
[=56= 的 order
]在itemList
时bool 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 应用程序上。
下面的结构由三个变量组成,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);
}
}
}
我的问题是,如何设置每个 item
[=56= 的 order
]在itemList
时bool 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 应用程序上。