gpt4 book ai didi

c# - 按两个不同类型的字段对不同模型的列表进行排序

转载 作者:行者123 更新时间:2023-11-30 16:11:50 26 4
gpt4 key购买 nike

我有两个模型:

public class CarRent
{
public string CarName { get; set; }
public string SystemId { get; set; }
public DateTime RentEndDate { get; set; }
}

public class CarPurchase
{
public string CarName { get; set; }
public string SystemId { get; set; }
public decimal Mileage { get; set; }
}

我需要将它们组合成一个列表分组依据 CarName 然后在每个组中我需要排序 模型最初由 SystemId,但如果模型具有相同的 SystemId - 我需要排序 CarRent 模型按 RentEndDateCarPurchaseMileage

我尝试过的:

我定义了一个接口(interface):

public interface ICarPurchaseOrdered
{
string CarName { get; }
string SystemId { get; }
string Order { get; }
}

让我的模型来实现它,Order 属性只返回二阶标准的字符串表示,然后我定义了一个 View 模型:

public class GroupedCardList
{
public string CarName { get; set; }
public IEnumerable<ICarPurchaseOrdered> Cars { get; set; }
}

然后我有一个石斑鱼,它只对我的模型进行分组:

public class CarGrouper
{
IEnumerable<GroupedCardList> Group(IEnumerable<ICarPurchaseOrdered> cars)
{
return cars.GroupBy(c => c.CarName)
.OrderBy(c => c.Key)
.Select(c => new GroupedCardList()
{
CarName = c.Key,
Cars = c.OrderBy(n => n.SystemId)
.ThenBy(n => n.Order)
});
}
}

但它不能正常工作,因为它对字符串进行排序,并且我在使用 Milage=90 购买汽车之前购买了使用 Milage=1200 的汽车。

我知道这个例子有点做作,但它完美地代表了我现在遇到的问题。请给我一些建议。

最佳答案

一种方法是实现自定义 IComparer .如果提取一个公共(public)基类:

public class Car
{
public string CarName { get; set; }
public string SystemId { get; set; }
}

public class CarRent : Car
{
public DateTime RentEndDate { get; set; }
}

public class CarPurchase : Car
{
public decimal Mileage { get; set; }
}

然后一个IComparer<Car>实现可能如下所示:

public class CarComparer : IComparer<Car>
{
public int Compare(Car x, Car y)
{
// compare by system id first
var order = string.Compare(x.SystemId, y.SystemId);
if (order != 0)
return order;

// try to cast both items as CarRent
var xRent = x as CarRent;
var yRent = y as CarRent;
if (xRent != null && yRent != null)
return DateTime.Compare(xRent.RentEndDate, yRent.RentEndDate);

// try to cast both items as CarPurchase
var xPurc = x as CarPurchase;
var yPurc = y as CarPurchase;
if (xPurc != null && yPurc != null)
return decimal.Compare(xPurc.Mileage, yPurc.Mileage);

// now, this is awkward
return 0;
}
}

然后您可以将比较器实例传递给 List.Sort Enumerable.OrderBy .

关于c# - 按两个不同类型的字段对不同模型的列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23877927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com