2017-12-01 6 views
0

私は問題を説明します:リスト(0,1,2,6,7)をリスト(6,7,0,1,2)にソートしたいのですが、したがって、リスト内のすべてのオブジェクト、つまり4よりも大きいオブジェクトは、小さいものから順に昇順にソートし、次に小さいものから順に昇順にソートする必要があります。C#リスト内の数字をソート

+0

アレイの問題で回転するアイテムと非常によく似ています。 – Shyju

+1

はラムダ式に慣れていて、 'Take()'と 'Skip()'はGoogle検索を行い、自分で試したコードを表示します。これはコードサービスサイトではありません。 – MethodMan

+0

入力の結果はどうなりますか?リスト list = new List {0,4,1,2,4,6,7,4}; '? – mjwills

答えて

2

この比較演算を行います。

public class MyComparer : IComparer<int> 
{ 
    public int Divider { get; set; } 
    public MyComparer(int divider) { Divider = divider; } 

    public int Compare(int x, int y) 
    { 
     if (x < Divider && y > Divider) return 1; 
     if (x > Divider && y < Divider) return -1; 
     return x.CompareTo(y); 
    } 
} 

そして、あなたはこのコードを実行することができます

List<int> list = new List<int> { 0, 1, 2, 6, 7 }; 
list = list.OrderBy(i => i, new MyComparer(4)).ToList(); 

は、それが必要ならば、それは、あなたが値4そのものを処理する方法を疑問に明確ではありません注意してください6,7グループの最初のエントリまたは0,1,2グループの最後のエントリになります。上記の各if()の不等式比較の1つに、=が含まれているはずです。

1

LINQとDoably:

using System; 
using System.Collections.Generic; 
using System.Linq; 

internal class Program 
{ 
    static void Main(string[] args) 
    { 
     List<int> myList = new List<int> { 0, 1, 2, 6, 7 }; 

     var bigger4 = myList   // from myList 
      .Where(item => item > 4) // filter all bigger 4 
      .OrderBy(i => i)   // order them by value ascending 
      .ToList();     // make list to allow AddRange() later 

     // I am putting 4rs into this list 
     var smaller5 = myList   // from myList 
      .Where(item => item <= 4) // filter all smalller equal 4 
      .OrderBy(i => i);   // order them by value ascending 

     bigger4.AddRange(smaller5); // add to first list 

     // output as string with , between values: 
     Console.WriteLine(string.Join(",", bigger4)); // which smaller5 added into bigger4 
     Console.ReadLine(); 
    } 
} 

それともExtensionmethodにそれを置く:

internal static class SillyThing 
{ 
    static public IList<int> 
     SortBigger_K_InFrontAnscendingThenAddSmallerEqual_K_Ascending(
      this IList<int> list, int K) 
    { 
     var biggerK = list 
      .Where(item => item > K) // filter all bigger K 
      .OrderBy(i => i)   // order them by value ascending 
      .ToList();     // make list to allow AddRange() later 

     // I am putting 4rs into this list 
     var smallerK = list 
      .Where(item => item <= K) // filter all smalller equal K 
      .OrderBy(i => i);   // order them by value ascending 

     biggerK.AddRange(smallerK); // add to first list 

     return biggerK; 
    } 
} 

そしてそうのようにそれを呼び出す:

var newList = "1,2,3,4,5,6,7,8,9,0,12,14,16,17,192,222,66,44,22,11".Split(',') 
    .Select(n => int.Parse(n)) 
    .ToList(); 

Console.WriteLine( 
    string.Join(",", newList. 
     SortBigger_K_InFrontAnscendingThenAddSmallerEqual_K_Ascending(70))); 
Console.ReadLine(); 

免責事項:

@JoelCoehoornのメソッドは、再利用性のためにsmaterです。それは、その特定のSILLYという拡張メソッドを使用しています。

関連する問題