2016-09-19 48 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