【问题标题】:Sorting a list by first finding the field to sort on within in the list通过首先在列表中找到要排序的字段来对列表进行排序
【发布时间】:2013-05-21 05:45:52
【问题描述】:

这似乎很难,如果能提供任何帮助或帮助,将不胜感激。

我有一个清单,清单。每个 Car 对象都有一个列表,List。我想按其中 1 个配件对我的汽车清单进行排序。在我的示例中,我保证有几个带有我要查找的附件的 Car 对象。

现在我知道了配件名称,但我不知道用于根据配件名称对我的汽车列表进行排序的语法。

  • AccessoryObj1 => 名称(字符串:动态转向)
  • AccessoryObj2 => 名称(字符串:Side Assist)

  • Car1 -> 列表(AccessoryObj1、AccessoryObj2、AccessoryObj3)

  • Car2 -> 列表(AccessoryObj1、AccessoryObj2、 AccessoryObj3)

列表(汽车 1、汽车 2)

我尝试的语法如下:

String sortField = "Side Assist";
List<Car> sortedList = sortedList.OrderBy(
                        x => x.Accessories.OfType<Accessory>().ToList().First(y => y.Name == sortField)).ToList();

我正在尝试通过引用每个汽车对象的附件列表来排序(升序)我的汽车列表,并在附件列表中的附件对象名称与 sortField 值匹配的第一个匹配项中进行匹配。

不幸的是,这种尝试会导致以下错误:

至少一个对象必须实现 IComparable

我希望我的问题足够清楚,并提前感谢。


感谢 user2399170 提供的解决方案,我是 3/4 的方式:以他们的解决方案/样本,我现在正在尝试将最终结果排序为升序/降序。这是调整后的代码:

public class Accessory
{
    public string Name { get; set; }
    public string Value { get; set; }
}

public class Car
{
    public string Name { get; set; }
    public IList<Accessory> Accessories { get; set; }
}

private IEnumerable<Car> GetCars()
    {
        var cars = new List<Car>();
        cars.Add(
            new Car()
            {
                Name = "CAR1",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "1" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "0" },
                    new Accessory() { Name = "Sat/Nav", Value = "1" },
                    new Accessory() { Name = "Side Assist", Value = "0" },
                    new Accessory() { Name = "Name", Value = "BMW" },
                }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR2",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "0" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "0" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "0" },
                    new Accessory() { Name = "Sat/Nav", Value = "0" },
                    new Accessory() { Name = "Side Assist", Value = "0" },
                    new Accessory() { Name = "Name", Value = "Mazda" },
                }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR3",
                Accessories = new List<Accessory>()
                {
                    new Accessory() { Name = "ABS Brakes", Value = "1" },
                    new Accessory() { Name = "Airbag", Value = "1" },
                    new Accessory() { Name = "Climate Control", Value = "1" },
                    new Accessory() { Name = "Heated Seats", Value = "1" },
                    new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                    new Accessory() { Name = "Radio", Value = "1" },
                    new Accessory() { Name = "Quattro", Value = "1" },
                    new Accessory() { Name = "Sat/Nav", Value = "1" },
                    new Accessory() { Name = "Side Assist", Value = "1" },
                    new Accessory() { Name = "Name", Value = "Audi" },

                }
            });

        String[] sortRules = new string[] { "Name" };

        List<Car> sortedCars = sortRules
            .SelectMany(sortRule => cars.Where(car => car.Accessories.Any(acc => acc.Name == sortRule)))
            .Distinct().ToList();

        return sortedCars;
    }

我想按排序字段“名称”的值对最终结果进行排序,在本例中为“Audi”、“BMW”、“Mazda”

这一切的工作原理是,用户可以从下拉“名称”中进行选择,结果可以按“名称”的值排序。不幸的是,这是我无法控制的第三方来源返回数据的方式。

【问题讨论】:

    标签: c# .net silverlight


    【解决方案1】:

    试试这个示例

    private static IEnumerable<Car> GetCars(string filterByAccessory, bool sortAscending = true)
    {
        var cars = new List<Car>();
        cars.Add(
            new Car()
            {
                Name = "CAR1",
                Accessories = new List<Accessory>()
            {
                new Accessory() { Name = "ABS Brakes", Value = "1" },
                new Accessory() { Name = "Airbag", Value = "1" },
                new Accessory() { Name = "Climate Control", Value = "1" },
                new Accessory() { Name = "Heated Seats", Value = "1" },
                new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                new Accessory() { Name = "Radio", Value = "1" },
                new Accessory() { Name = "Quattro", Value = "0" },
                new Accessory() { Name = "Sat/Nav", Value = "1" },
                new Accessory() { Name = "Side Assist", Value = "0" },
                new Accessory() { Name = "Name", Value = "BMW" },
            }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR2",
                Accessories = new List<Accessory>()
            {
                new Accessory() { Name = "ABS Brakes", Value = "1" },
                new Accessory() { Name = "Airbag", Value = "1" },
                new Accessory() { Name = "Climate Control", Value = "1" },
                new Accessory() { Name = "Heated Seats", Value = "0" },
                new Accessory() { Name = "HID Xenon Headlights", Value = "0" },
                new Accessory() { Name = "Radio", Value = "1" },
                new Accessory() { Name = "Quattro", Value = "0" },
                new Accessory() { Name = "Sat/Nav", Value = "0" },
                new Accessory() { Name = "Side Assist", Value = "0" },
                new Accessory() { Name = "Name", Value = "Mazda" },
            }
            });
        cars.Add(
            new Car()
            {
                Name = "CAR3",
                Accessories = new List<Accessory>()
            {
                new Accessory() { Name = "ABS Brakes", Value = "1" },
                new Accessory() { Name = "Airbag", Value = "1" },
                new Accessory() { Name = "Climate Control", Value = "1" },
                new Accessory() { Name = "Heated Seats", Value = "1" },
                new Accessory() { Name = "HID Xenon Headlights", Value = "1" },
                new Accessory() { Name = "Radio", Value = "1" },
                new Accessory() { Name = "Quattro", Value = "1" },
                new Accessory() { Name = "Sat/Nav", Value = "1" },
                new Accessory() { Name = "Side Assist", Value = "1" },
                new Accessory() { Name = "Name", Value = "Audi" },
    
            }
            });
    
        var filteredCars = cars.Where(c => c.Accessories.Any(a => a.Name == filterByAccessory));
    
        var sortedCars = sortAscending
            ? filteredCars.OrderBy(x => x.Accessories.First(a => a.Name == filterByAccessory).Value)
            : filteredCars.OrderByDescending(x => x.Accessories.First(a => a.Name == filterByAccessory).Value);
    
        return sortedCars;
    }
    

    【讨论】:

    • 哇,谢谢!我已经使用它并将尽快实施到我的项目中。如果您不介意的话,有 2 个问题: 1. sortRules:为什么要多于 1 个?这样您就可以一次对多个字段进行排序吗?对于我的应用程序,我只会使用 1。 2. 我想使用 sortField 按升序或降序排序,例如在您的示例中,我将按安全气囊排序。真正的实现需要这个功能,不幸的是这个要求对于汽车示例没有意义。
    • 更新了原始问题并提供了进一步的解释。
    • 1. SortRules - 实际上将其称为 sortRule 会更好,因为它确实是定义搜索汽车配件的顺序的一个规则。我认为您需要一些复杂的东西作为这个示例。如果你
    • 我添加了新样本,请检查
    • 谢谢!这个解决方案正是我所需要的。我真的很感谢你抽出时间来帮助我。希望 1 天我能回答你的 1 个问题。
    【解决方案2】:

    要按Accessory 排序,您需要确保该类实现了IComparable 接口

    public class Accessory : IComparible
    {
        public int CompareTo(object obj) {
            //Return 0 for equals
            //Return -1 if this object precedes the given object
            //Return 1 if this object follows the given object
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2012-05-21
      • 2019-07-03
      • 2017-08-11
      相关资源
      最近更新 更多