c#根据属性值重新排列类对象?

时间:2016-09-19 19:53:41

标签: c# performance linq

问题是: 我们将模型id作为函数的输入参数,我们需要在具有luxury = false的汽车中将该模型id转移到顶部。豪华车应保持在同一位置。

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 =假)。

我想用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以更好的方式实现这一目标吗?

1 个答案:

答案 0 :(得分: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));