2016-11-30 15 views
0

特定の番号をこのリストの先頭に移動したいとします。リストの要素をリストの先頭に移動する

int numberToBeMovedOnTop = 4; 
List<int> lst = new List<int>(){1, 2, 3, 4, 5, 5, 4, 7, 9, 4, 2, 1}; 
List<int> lstOdd = lst.FindAll(l => l == numberToBeMovedOnTop); 
lstOdd.AddRange(lst.FindAll(l => l != numberToBeMovedOnTop)); 

numberToBeMovedOnTopは変数である。

これは私に望ましい結果をもたらしますが、これに対するより良い解決策ですか?リストを一度反復して、最初の出現をnumberToBeMovedOnTop、最初の出現を2回目の出現をnumberToBeMovedOnTopと2番目の要素などと交換することができます。しかし、リストを2度反復することなく、組み込みのC#関数を使ってこれを行うことはできますか?

+0

これを行うためのさまざまな方法の負荷が含まれているhttp://stackoverflow.com/questions/1668451/use-linq-to-move-item-to-top-of-list –

答えて

12

あなたは、LINQを使用することができます。

List<int> lstOdd = lst.OrderByDescending(i => i == numberToBeMovedOnTop).ToList(); 

なぜOrderByDescending?比較結果はboolで、truefalseより高いためです。また、使用することができます

List<int> lstOdd = lst.OrderBy(i => i == numberToBeMovedOnTop ? 0 : 1).ToList(); 

OrderByOrderByDescendingstable sortを行っているので、これが機能すること。つまり、元の注文はすべての同等品目にとどまります。

何が価値があるために

は、ここに任意のタイプと述語と連携し、もう少し効率的で拡張メソッドです:

public static List<T> PrependAll<T>(this List<T> list, Func<T, bool> predicate) 
{ 
    var returnList = new List<T>(); 
    var listNonMatch = new List<T>(); 
    foreach (T item in list) 
    { 
     if (predicate(item)) 
      returnList.Add(item); 
     else 
      listNonMatch.Add(item); 
    } 
    returnList.AddRange(listNonMatch); 
    return returnList; 
} 

使用方法:LINQを使用して別にList<int> lstOdd = lst.PrependAll(i => i == numberToBeMovedOnTop);

2

linqなしでこれを行うのと同じように効率的に/理解できるかもしれません。

var listToAdd = new List<int>(); 
var listOdd = new List<int>(); 
for(int i = 0; i < lst.Count; i++) 
{ 
    if(lst[i] == numberToBeMovedOnTop) 
    { 
     listToAdd.Add(numberToBeMovedOnTop); 
    } 
    else 
    { 
     listOdd.Add(lst[i]); 
    } 

} 
listOdd.AddRange(listToAdd); 

あなたが削除したものを追跡し、その後に追加してください。

0

述語で、次にユニオン?

 var nums = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
     var grp = nums.GroupBy(x => x % 2 == 0).ToList(); 
     var changed = grp[0].Union(grp[1]).ToList(); 
+0

、この質問をチェックアウトあなたの述語は異なるが、あなたはその考えを得る – Jimbobyo

関連する問題