2016-09-19 78 views
0

問題是: 我們有模型id作爲函數的輸入參數,並且我們需要將車型中頂部的那個模型ID轉移到奢侈品=假。豪華車應保持在同一位置。c#基於屬性值重新排列類對象?

class Car 
{ 
    int ModelId; 
    bool IsLuxury; 
} 

樣車對象:

1. new Car(1, true) 
2. new Car(19, true) 
3. new Car(1, true) 
4. new Car(7, true) 
5. new Car(8, false) 
6. new Car(9, false) 
7. new Car(1, false) 
8. new Car(25, false) 
9. new Car(9, false) 
10. new Car(1, false) 

例如,如果輸入modelId = 1,列表順序應該像改變:

1. new Car(1, true) 
2. new Car(19, true) 
3. new Car(1, true) 
4. new Car(7, true) 
5. new Car(1, false) 
6. new Car(1, false) 
7. new Car(8, false) 
8. new Car(9, false) 
9. new Car(25, false) 
10. new Car(9, false) 

與豪華的轎車=真正保持在同一等級[排名1到4],

汽車與modelId = 1(輸入)和IsLuxury = false採取下一個職位,

和其他汽車隨後進來(型號不是1和IsLuxury = false)。

我想用C#編寫它。我有一個解決方案,它返回我正確的答案,但我不確定其性能。

var res = lst.Where(c => c.IsLuxury== true) 
.Concat(lst.Where(c => c.ModelId == 1 && c.IsLuxury== false)) 
.Concat(lst.Where(c => c.ModelId != 1 && c.IsLuxury== false)).ToList(); 

有人可以建議在C#中的其他方式,或使用LINQ來實現這個更好的方式嗎?

+0

您可以創建一個自定義的類,它實現[IComparer的]( https://msdn.microsoft.com/en-us/library/bb549422(v=vs.110).aspx),然後調用'lst.OrderBy(c => c,new CustomComparer())'。 – itsme86

+0

我真的不明白訂單的標準。根據車型ID,你似乎沒有真正對車進行分類。這僅僅是Id == 1的特例嗎?因爲地方9和10沒有排序... –

+0

你可以添加一些代碼嗎? – maverick

回答

2

你可以做這樣的事情,使用IComparer<Car>

class CarComparer : IComparer<Car> 
{ 
    private int _sortModel; 

    public CarComparer(int sortModel) 
    { 
     _sortModel = sortModel; 
    } 

    public int Compare(Car car1, Car car2) 
    { 
     if (car1.IsLuxury) 
      return car2.IsLuxury ? 0 : -1; 
     else if (car2.IsLuxury) 
      return 1; 

     if (car1.ModelId == _sortModel) 
      return car2.ModelId == _sortModel ? 0 : -1; 
     return car2.ModelId == _sortModel ? 1 : 0; 
    } 
} 

然後你會使用這樣的:

int modelToSortBy = 1; 
var res = lst.OrderBy(c => c, new CarComparer(modelToSortBy)); 
+0

modelId == 1,這裏1是可變的,可以爲每個呼叫改變,即它可以是2次下一次 – maverick

+0

這很容易修復。我會更新我的答案。 – itsme86

+0

@sahil我已經更新了答案。 – itsme86