使用 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
            }
        }
    }
}