2017-08-04 89 views
-6

我有一個列表包含範圍[-1,1]中的多個值,我想從0到1,然後從0到-1排序它們。C#列表排序與多個範圍

例如:0.0,0.25,0.9,1.0,-0.1,-0.24,-0.85

我怎麼能做到這一點,也許使用IComparable的?我想避免使用LINQ。

+7

爲什麼你想避免的LINQ?另外,'-85'在你的列表中,那裏會出現? – DavidG

+3

所以你需要檢查一個值是否定的,然後按絕對值排序? –

+0

零去哪裏? – DavidG

回答

1

您可以使用Sort overload接受Comparison。 這應該工作:

public static int MyCompare(double x, double y) 
{ 
    if (x >= 0.0 == y>=0.0) 
     // same sign, compare by absolute value 
     return Math.Abs(x).CompareTo(Math.Abs(y)); 

    if (x < 0.0) 
     return 1; 

    return -1; 
} 

用法:

var list = new List<double>(); 
// fill your list 
// call sort using the Comparison 

// hard syntax 
//list.Sort((x,y) => MyCompare(x, y)); 

// easy syntax :) 
list.Sort(MyCompare); 

foreach (var x in list) 
    Console.WriteLine(x); 

在看到它的工作:https://dotnetfiddle.net/odOJYh

3

的LINQ的方式就是做這個(假設你想用一個排序的數組結束了,不需要ToArray位):

var sorted = values.OrderBy(value => value < 0).ThenBy(Math.Abs).ToArray(); 

我展示的唯一原因是這樣你可以與非LINQ的方式利用比較器進行比較:

public class MyComparer : IComparer<double> 
{ 
    public int Compare(double x, double y) 
    { 
     if(x < 0) 
     { 
      if(y >= 0) return 1; 
      return -x.CompareTo(y); 
     } 
     else 
     { 
      if(y < 0) return -1; 
      return x.CompareTo(y); 
     } 
    } 

    public static MyComparer Instance{ get; } = new MyComparer(); 

    private MyComparer() {} 
} 

然後使用它:

Array.Sort(values, MyComparer.Instance); 

重點是它有更多的代碼(和更多的地方搞混了比較)。這也將數組排序(LINQ版本會在你要求的時候創建一個副本)。