2011-01-18 19 views
4

で、私は今、私は最初のID 1085にして、いくつかの要素を移動したいオブジェクト移動項目が最初の配列

MyObjects[] mos = GetMyObjectsArray(); 

の配列を持っているので、私はLINQでこのようなコードを記述し、よりエレガントな方法がありますこれを行う?

mos.Where(c => c.ID == 1085).Take(1).Concat(mos.Where(c => c.ID != 1085)).ToArray(); 

注意が、私は最初の項目でswaping、他の項目の位置を保存することはそれはLINQではありませんソリューション

+0

をしてみましょうアイテム:

static class ListExtensions { public static bool MoveToFront<T>(this List<T> list, Predicate<T> match) { int idx = list.FindIndex(match); if (idx != -1) { if (idx != 0) // move only if not already in front { T value = list[idx]; // save matching value list.RemoveAt(idx); // remove it from original location list.Insert(0, value); // insert in front } return true; } return false; // matching value not found } } 

は、その後、あなたは(あなたの例から変更)MoveToFront拡張メソッドを使用することができます'あなたが望むのは' x 'の場所です。この「空の」アイテムはどうすればいいですか?折りたたむか、スワップする? – abatishchev

+1

あなたのコードには、a)新しい配列の作成b)重複した '1085'の削除など、追加のプロパティがあります。 c)そのような項目が存在しない場合は投げない。これらは正確に複製する必要がありますか? – Ani

+0

他のアイテムの配置を保存したいので、最初のアイテムとのスワップは解決策ではありません –

答えて

5

ではありませんが、それは私が配列でそれを行うだろう方法です。

public static bool MoveToFront<T>(this T[] mos, Predicate<T> match) 
    { 
    if (mos.Length == 0) 
    { 
     return false; 
    } 
    var idx = Array.FindIndex(mos, match); 
    if (idx == -1) 
    { 
     return false; 
    } 
    var tmp = mos[idx]; 
    Array.Copy(mos, 0, mos, 1, idx); 
    mos[0] = tmp; 
    return true; 
    } 

使用方法:配列は、あなたがしようとしている操作のための最良のデータ構造ではありません

MyObject[] mos = GetArray(); 
mos.MoveToFront(c => c.ID == 1085); 
+0

私はニックピッキング最初の行にはあまりにも多くのaがあります:) – nik0lias

+0

修正ありがとうございました! –

+0

あなたが 'void'を実行して例外を投げることができるならば、返すものは' bool'ですか? – abatishchev

1

、それは潜在的に多くの項目をコピーする必要があります。あなたがしていることについては、リストを使うべきです。

まず、次のようにリストの拡張メソッドを定義します。id `と

List<int> mos = GetMyObjectsList(); 
mos.MoveToFront(i => i == 1085); 
+1

リストの下では、Listも配列を使用しています。したがって、forループソリューションよりも速くはありません。ちょっと簡単。 –

2
// input array 
T[] arr = Get(); 

// find the item 
int index = Array.FindIndex(arr, i => i.ID == 1085); 
if (index == -1) 
    throw new InvalidOperationException(); 

// get the item 
T item = arr[index]; 

// place the item to the first position 
T[] result = new T[arr.Length]; 
result[0] = item; 

// copy items before the index 
if (index > 0) 
    Array.Copy(arr, 0, result, 1, index); 

// copy items after the index 
if (index < arr.Length) 
    Array.Copy(arr, index + 1, result, index + 1, arr.Length - index - 1); 

return result; 
関連する問題