2015-05-27 84 views
0

以下工作精細分選三列這是DateTime和字符串如何在lambda表達式中對long或int數據類型進行排序?

data = new List<WorkItem<object>>(rows); 
//....Add items to list 
data.Sort((x, y) => 
{ 
    int result = DateTime.Compare((DateTime)x.Column1, (DateTime)y.Column1); 
    if (result == 0) 
     result = string.Compare((string)x.Column2, (string)y.Column2); 
    if (result == 0) 
     result = string.Compare((string)x.Column3, (string)y.Column3); 
    return result; 
}); 

我怎麼能還包括在lambda表達式排序long和int數據類型的排序?

下面給出了一個'long' does not contain a definition for 'Compare'

data.Sort((x, y) => 
{ 
    int result = DateTime.Compare((DateTime)x.Column1, (DateTime)y.Column1); 
    if (result == 0) 
     result = string.Compare((string)x.Column2, (string)y.Column2); 
    if (result == 0) 
     result = string.Compare((string)x.Column3, (string)y.Column3); 
    if (result == 0) 
     result = long.Compare((long)x.Column15, (long)y.Column15); 
    return result; 
}); 

列是泛型類型牛逼

回答

2

考慮到long不能null,您可以簡單:

result = ((long)x.Column15).CompareTo((long)y.Column15); 

或者,當有疑問:正確地對所有的基本類型

result = Comparer<long>.Default.Compare((long)x.Column15, (long)y.Column15); 

工程和所有類型的支持IComparable<>IComparable,並正確處理null值。

2

長型確實不包含定義進行比較。如果第一個對象低於第二個,則比較返回負值,如果相等,則返回0;如果第一個大於第二個,則返回正值。鑑於此,您可以返回兩個長整型值的差異。修改後的代碼如下:

data.Sort((x, y) => 
{ 
int result = DateTime.Compare((DateTime)x.Column1, (DateTime)y.Column1); 
if (result == 0) 
    result = string.Compare((string)x.Column2, (string)y.Column2); 
if (result == 0) 
    result = string.Compare((string)x.Column3, (string)y.Column3); 
if (result == 0) 
    { 
     long r = (long)x.Column15 - (long)y.Column15; 
     result = r == 0 ? 0 : r < 0 ? -1 : 1; 
    } 
return result; 
}); 

確保將Column15更改爲任何您需要的地方。

+0

@xanatos爲什麼你會把它轉換爲int如果值很長? – BVintila

+0

嘗試編譯它。 'result'是一個'int' ...我甚至不確定這樣做是個好主意......等等......這顯然是錯誤的......請參閱https:// ideone。例如com/Fpvwiv。 – xanatos

+0

你對int的結果是正確的,所以不會像那樣工作。謝謝。編輯答案。這應該現在工作。 – BVintila

相關問題