重新排序序列的最简单方法

Gre*_*Gum 1 c# linq

考虑List中具有int属性Order的A类的4个实例(最多100个)。

a0.Order is 0
a1.Order is 1
a2.Order is 2
a3.Order is 3
Run Code Online (Sandbox Code Playgroud)

现在,需要更改Order属性,以便将a0插入a3之前(或在列表中的任何索引处-可以在开始,结束或中间)。

结果应该是这样的:

a0.Order is 2
a1.Order is 0
a2.Order is 1
a3.Order is 3
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个列表,列表的实际物理顺序并不重要,仅更改属性即可。

项目的数量不只是在更改“订单”。

最简单的方法是什么?

Dir*_*oer 7

你可以这样做:

void MoveAndUpdateOrder(List<A> list, A item, int positionToInsert)
{
    // Order elements
    var ordered_list = list.OrderBy(a => a.Order).ToList();

    // Remove and insert at the proper position
    ordered_list.Remove(item);
    ordered_list.Insert(positionToInsert, item);

    // Update the Order properties according to it's current index
    for ( int i = 0; i < ordered_list.Count; i++ )
        ordered_list[i].Order = i;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

var a0 = new A { Order = 0 };
var a1 = new A { Order = 1 };
var a2 = new A { Order = 2 };
var a3 = new A { Order = 3 };

var list = new List<A>
{
    a0, a1, a2, a3
};

MoveAndUpdateOrder( list, a0, 2 );
Run Code Online (Sandbox Code Playgroud)


Tim*_*Tim 5

Order属性不应为整数,而应为十进制。您可以轻松更改值,然后按其排序以任意顺序检索项目。新值是前一个值和后一个值之间的中点。

PS然后,您只需要更改要重新定位的列表中项目的Order属性。