使用 C# 更改和更新通用列表项的顺序
change and update order of generic list items with C#
我正在研究一种算法,该算法回答 here 可以解决特定问题,但我想让这个算法通用,以便将它用于我的应用程序中的任何类型的列表。但我被困住了。
例如:我有一个场景 class,其中包含一个名为 Order:
的变量
public class Scenario
{
public int Id{get; set;}; // not incremented can be any value!
public int Order{get; set;};
public string Title{get; set;};
}
而且我可以调用此方法来根据需要更改任何场景的顺序:
private void UpdateOrders(Scenario targetScenario, short newOrder, List<Scenario> items)
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}
这适用于任何其他特定列表,但每次都必须重复此算法以更新每个列表的顺序。所以我尝试扩展这个算法以避免编写重复代码。
这是我尝试的方法,但显然它不起作用:
private void UpdateOrders<T>(T targetScenario, short newOrder, List<T> items)
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}
有人能帮忙吗?
谢谢
您需要签订一份合同,确保您使用的物品的 属性 为 int Order
。然后将您的函数 T
类型限制为您的合约类型。
public interface ISortable
{
int Id { get; set; }
int Order { get; set; }
}
public class Scenario : ISortable
{
public int Id { get; set; }
public int Order { get; set; }
public string Title { get; set; }
}
private void UpdateOrders<T>(T targetScenario, short newOrder, List<T> items) where T : ISortable
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}
我正在研究一种算法,该算法回答 here 可以解决特定问题,但我想让这个算法通用,以便将它用于我的应用程序中的任何类型的列表。但我被困住了。
例如:我有一个场景 class,其中包含一个名为 Order:
的变量public class Scenario
{
public int Id{get; set;}; // not incremented can be any value!
public int Order{get; set;};
public string Title{get; set;};
}
而且我可以调用此方法来根据需要更改任何场景的顺序:
private void UpdateOrders(Scenario targetScenario, short newOrder, List<Scenario> items)
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}
这适用于任何其他特定列表,但每次都必须重复此算法以更新每个列表的顺序。所以我尝试扩展这个算法以避免编写重复代码。 这是我尝试的方法,但显然它不起作用:
private void UpdateOrders<T>(T targetScenario, short newOrder, List<T> items)
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}
有人能帮忙吗?
谢谢
您需要签订一份合同,确保您使用的物品的 属性 为 int Order
。然后将您的函数 T
类型限制为您的合约类型。
public interface ISortable
{
int Id { get; set; }
int Order { get; set; }
}
public class Scenario : ISortable
{
public int Id { get; set; }
public int Order { get; set; }
public string Title { get; set; }
}
private void UpdateOrders<T>(T targetScenario, short newOrder, List<T> items) where T : ISortable
{
items = items.OrderBy(_ => _.Order).ToList();
bool seen = false;
for (int i = 0; i < items.Count; i++)
{
if (items[i].Id == targetScenario.Id)
{
items[i].Order = newOrder;
seen = true;
}
else if (seen)
{
if (items[i].Order <= newOrder)
{
items[i].Order--; // move it left
}
}
else
{
if (items[i].Order >= newOrder)
{
items[i].Order++; // move it right
}
}
}
}