首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >首先找到要在列表中排序的字段,对列表进行排序

首先找到要在列表中排序的字段,对列表进行排序
EN

Stack Overflow用户
提问于 2013-05-17 22:20:38
回答 2查看 123关注 0票数 1

这似乎很困难,并将感谢任何帮助或帮助,一个人可能能够提供。

我有一份名单,清单。每个汽车对象都有一个列表,列表。我想把我的汽车清单按这些配件中的一个分类。在我的例子中,我保证有几个带有我要找的附件的汽车物体。

现在我知道了附件名,但是我不知道使用什么语法来对附件名上的汽车列表进行排序。

  • AccessoryObj1 =>名称(String:动态引导)
  • AccessoryObj2 =>名称(字符串:侧协助)
  • Car1 -> List (AccessoryObj1,AccessoryObj2,AccessoryObj3)
  • Car2 -> List (AccessoryObj1,AccessoryObj2,AccessoryObj3)

列表(Car1,Car2)

我尝试的语法如下:

代码语言:javascript
复制
String sortField = "Side Assist";
List<Car> sortedList = sortedList.OrderBy(
                        x => x.Accessories.OfType<Accessory>().ToList().First(y => y.Name == sortField)).ToList();

我试图通过引用每个Car对象的附件列表,并在附件列表中的附件对象名称与sortField值匹配的第一个匹配项,来提高我的汽车列表。

不幸的是,此尝试导致以下错误:

至少有一个对象必须实现IComparable

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

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

代码语言:javascript
复制
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;
    }

我想根据排序字段'Name‘的值对最终结果进行排序,在这个示例中,"Audi“、"BMW”、"Mazda“

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-19 17:26:26

试试看这个样本

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2013-05-17 22:23:16

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

代码语言:javascript
复制
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
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16618727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档