-1

実際、私は次のようなリストを持っています

oldList= ['First','Second','Third',.....'Seventh'];

newArrayはそのようなものでなければなりません

newArray=['First',.........'Seventh','Second','Third']

では、linq c#でそのような順序を提供するにはどうすればよいですか?

私の最初の要素は古い場所に保管する必要があるということです。しかし、リストの最後まで2番目と3番目の要素をスキップする必要があります

4

4 に答える 4

1

はい、これはLINQで実行できますが、最も効率的ではない場合があります。

var newArray = oldList.Take(1)
    .Concat(oldList.Skip(3).Take(4))
    .Concat(oldList.Skip(1).Take(2))
    .ToArray();

ただし、元のコンテナがaのList<T>場合は、もう少し効率的に作業を行うことができます。

var newList = oldList.GetRange(0, 1)
    .Concat(oldList.GetRange(3, 4))
    .Concat(oldList.GetRange(1, 2))
    .ToList();

更新

キックとニヤリのために、私は先に進んで、提案された方法のいくつかの時間を計りました、そしてそれは@LBがGet/Add/RemoveRange()一番上に来るように見えます:

100,000回以上の反復:

  • Skip()/ Take()は82ミリ秒かかりました(0.00082ミリ秒/呼び出し)
  • GetRange()/ Concat()は69ミリ秒かかりました(0.00069ミリ秒/呼び出し)
  • OrderBy()/ ThenBy()は145ミリ秒かかりました(0.00145ミリ秒/呼び出し)
  • Add / Get / RemoveRange()には21ミリ秒かかりました(0.00021ミリ秒/呼び出し)

もちろん、ここではマイクロ最適化に取り組んでいるので、あなたにとって最も意味があり、最も保守しやすいものを使用すると思います。しかし、LBのソリューションが最もパフォーマンスが高いように見えます(そして読みやすいです)。

于 2012-10-16T14:16:55.933 に答える
1

コレクションがすでにリストの場合は、最初の行をスキップできます

List<string> oldList2 = new List<string>(oldList);
var tmp = oldList2.GetRange(1, 2);
oldList2.RemoveRange(1, 2);
oldList2.AddRange(tmp);
于 2012-10-16T14:21:20.080 に答える
1

奇妙な要件ですがOrderBy、この場合でも使用できます。

var newArray = oldList.Select((t, index) => new { t, index })
                      .OrderBy(x => x.index == 1 || x.index == 2)
                      .ThenBy(x => x.index)
                      .Select(x => x.t)
                      .ToArray();

ここにデモがあります: http://ideone.com/qJOlv

于 2012-10-16T14:15:44.703 に答える
0

LINQ は、既存のデータを変更するのではなく、データ ソースにクエリを実行して新しい結果を生成するように設計されています。

この問題を解決するために私が使用する一般的なアプローチは次のとおりです。

var second = array[1];
var third = array[2];

for(int i = 3; i < array.Length; i++)
{
    array[i-2] = array[i];
}

array[array.Length-2] = second;
array[array.Length-1] = third;

本当に LINQ を使用する必要がある場合は、次のようにします。

var newArray = array.Take(1)
          .Concat(array.Skip(3))
          .Concat(array.Skip(1).Take(2))
          .ToArray();

このアプローチでは、データ ソースが 3 回繰り返されることに注意してください。それが実際に配列またはリストである場合は問題ありませんが、実際には、それIEnumerable<T>が悪いクエリまたは複雑な操作の結果である場合。

于 2012-10-16T14:31:53.287 に答える