1

2次元リストの組み込みの高速メソッド、C#の配列または辞書を使用して要素を「自動的かつ高速に」交換する方法はありますか?

編集:より具体的に:私は2つの要素を交換するだけでなく、おそらくn個の要素/列の順序を変更します

私はこのようなものを持っています:10k行の2dデータ構造(10k要素のリスト)そしてそれらの要素のそれぞれは再び5要素のリストです(例えば文字列のリストのリスト>>)。

  0 1 2 3 4 
0 A B C D E
1 A A A A A
2 d d c k x
3 ...
.
.
10000 ...

インデックス0と2の要素/列のすべての10k行を交換する方法はありますか?

最初は0行目:ABCDE、スワップ後:CBADE

または、すべての行をループして、インデックス0と2の要素/列を自分で交換する必要がありますか?

編集:私のビジネスロジックでは、2Dデータ構造は行ごとにループされ、要素ごとにループされ、値はどこかに挿入されます。したがって、私の考えは、foreach要素をループするのではなく、すべての行と要素を特定の順序でループすることです。0、1、2、3、4の順序で要素にアクセスしたくないので、2、1、0、3、4の順序でアクセスします。foreach方式ではなく、特定の順序でlistelementsにアクセスするのが遅くなるという懸念はありますか?パフォーマンスが低い?

編集:javaCollections.swapへのリンクがありますhttp://www.java-examples.com/swap-elements-java-arraylist-example

4

3 に答える 3

1

組み込みのものは何もないと思いますが、独自の拡張機能を簡単に作成できます。

public static class ListExtensions
{
    public static void Swap<T>(this IList<T> list, int index1, int index2)
    {
        T temp = list[index1];
        list[index1] = list[index2];
        list[index2] = temp;
    }
}

(Reeds Copseys のアプローチに基づく: https://stackoverflow.com/a/1111039/284240 )

サンプルデータは次のとおりです。

var rnd = new Random();
var hugeList = new List<List<int>>();
for (int i = 0; i < 10000; i++)
{
    var innerList = new List<int>();
    for (int ii = 0; ii < 5; ii++)
    {
        innerList.Add(rnd.Next(1,100000));
    }
    hugeList.Add(innerList);
}

すべての内部リストのインデックス 0 と 2 を交換します。

foreach (var innerList in hugeList)
{ 
    innerList.Swap(0, 2);
}

任意のタイプのリストと配列で機能することに注意してください(両方が を実装しているためIList<T>)。

于 2012-07-17T09:34:12.857 に答える
1

この操作を実行できるデータ構造が必要です。List<T>と の混合物を使用してそれを達成しましたDictionary

このように、列の順序を 1 か所で変更すると、すべてに影響します。

public class Order
{
    public Order(int number)
    {
        Number = number;
    }

    public int Number { get; set; }
}

public class Item
{
    // ... whatever your item is 
}

public class Program
{
    static void Main()
    {
        var list = new List<Dictionary<Order, Item>>();
        var orders = new List<Order>()
                        {
                            new Order(1),
                            new Order(2),
                            new Order(3),
                            new Order(4),
                            new Order(5)
                        };

        for (int i = 0; i < 10000; i++)
        {
            list.Add( new Dictionary<Order, Item>()
                        {
                            {orders[0], new Item()},
                            {orders[1], new Item()},
                            {orders[2], new Item()},
                            {orders[3], new Item()},
                            {orders[4], new Item()}
                        });
        }

        // Now access items in order 

        var item = list[100][orders[1]];

        // now you can swap the orders: replace 2 and 4
        var temp = orders[1];
        orders[1] = orders[3];
        orders[3] = temp;

        var item = list[100][orders[1]]; // now points to previously 4th item!!
    }
}
于 2012-07-17T10:22:57.070 に答える
0

これをベンチマークして、より優れているかどうかを確認することをお勧めします。10,000 個の要素があれば、より優れている可能性があります。

PC の近くにない Sudocode:

New temp array of size to copy
Array.Copy(from firstblock to temp)
Array.Copy(from secondblock to firstblock)
Array.Copy(from temp to secondblock)
于 2012-08-16T10:58:05.630 に答える