Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过首先在列表中查找要排序的字段对列表进行排序_C#_.net_Silverlight - Fatal编程技术网

C# 通过首先在列表中查找要排序的字段对列表进行排序

C# 通过首先在列表中查找要排序的字段对列表进行排序,c#,.net,silverlight,C#,.net,Silverlight,这一个似乎很难,并将感谢任何帮助或协助,一个人可能能够给予 我有一张单子,单子。每个汽车对象都有一个列表,列表。我想按这些附件中的一个对我的汽车清单进行分类。在我的例子中,我保证有几个汽车物体和我试图找到的附件 现在我知道了附件名称,但我不知道在附件名称上对汽车列表进行排序时使用的语法 AccessoryObj1=>名称(字符串:动态转向) AccessoryObj2=>名称(字符串:侧辅助) Car1->列表(附件OBJ1、附件OBJ2、附件OBJ3) Car2->列表(附件OBJ1、附件O

这一个似乎很难,并将感谢任何帮助或协助,一个人可能能够给予

我有一张单子,单子。每个汽车对象都有一个列表,列表。我想按这些附件中的一个对我的汽车清单进行分类。在我的例子中,我保证有几个汽车物体和我试图找到的附件

现在我知道了附件名称,但我不知道在附件名称上对汽车列表进行排序时使用的语法

  • AccessoryObj1=>名称(字符串:动态转向)
  • AccessoryObj2=>名称(字符串:侧辅助)

  • Car1->列表(附件OBJ1、附件OBJ2、附件OBJ3)

  • Car2->列表(附件OBJ1、附件OBJ2、, 附件OBJ3)
清单(Car1、Car2)

我尝试的语法如下所示:

String sortField = "Side Assist";
List<Car> sortedList = sortedList.OrderBy(
                        x => x.Accessories.OfType<Accessory>().ToList().First(y => y.Name == sortField)).ToList();
String sortField=“侧面辅助”;
List sortedList=sortedList.OrderBy(
x=>x.Accessories.OfType().ToList().First(y=>y.Name==sortField)).ToList();
我试图通过引用每个汽车对象的附件列表,并在附件列表中附件对象的名称与sortField值匹配的情况下进行第一次匹配,从而对我的汽车列表进行排序(升序)

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

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

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


感谢用户2399170提供的解决方案,我已经完成了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;
    }
公共级附件
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
}
公车
{
公共字符串名称{get;set;}
公共IList附件{get;set;}
}
私人IEnumerable GetCars()
{
var cars=新列表();
汽车,加上(
新车
{
Name=“CAR1”,
附件=新列表()
{
新附件(){Name=“ABS Brakes”,Value=“1”},
新附件(){Name=“Airbag”,Value=“1”},
新附件(){Name=“Climate Control”,Value=“1”},
新附件(){Name=“加热型座椅”,Value=“1”},
新附件(){Name=“HID氙气大灯”,Value=“1”},
新附件(){Name=“Radio”,Value=“1”},
新附件(){Name=“Quattro”,Value=“0”},
新附件(){Name=“Sat/Nav”,Value=“1”},
新附件(){Name=“Side Assist”,Value=“0”},
新附件(){Name=“Name”,Value=“BMW”},
}
});
汽车,加上(
新车
{
Name=“CAR2”,
附件=新列表()
{
新附件(){Name=“ABS Brakes”,Value=“1”},
新附件(){Name=“Airbag”,Value=“1”},
新附件(){Name=“Climate Control”,Value=“1”},
新附件(){Name=“加热型座椅”,Value=“0”},
新附件(){Name=“HID氙气大灯”,Value=“0”},
新附件(){Name=“Radio”,Value=“1”},
新附件(){Name=“Quattro”,Value=“0”},
新附件(){Name=“Sat/Nav”,Value=“0”},
新附件(){Name=“Side Assist”,Value=“0”},
新附件(){Name=“Name”,Value=“Mazda”},
}
});
汽车,加上(
新车
{
Name=“CAR3”,
附件=新列表()
{
新附件(){Name=“ABS Brakes”,Value=“1”},
新附件(){Name=“Airbag”,Value=“1”},
新附件(){Name=“Climate Control”,Value=“1”},
新附件(){Name=“加热型座椅”,Value=“1”},
新附件(){Name=“HID氙气大灯”,Value=“1”},
新附件(){Name=“Radio”,Value=“1”},
新附件(){Name=“Quattro”,Value=“1”},
新附件(){Name=“Sat/Nav”,Value=“1”},
新附件(){Name=“Side Assist”,Value=“1”},
新附件(){Name=“Name”,Value=“Audi”},
}
});
String[]sortRules=新字符串[]{“Name”};
列表sortedCars=sortRules
.SelectMany(sortRule=>cars.Where(car=>car.Accessories.Any(acc=>acc.Name==sortRule)))
.Distinct().ToList();
返回分拣车;
}
我想根据排序字段'Name'的值对最终结果进行排序,在本例中,该字段为“奥迪”、“宝马”、“马自达”


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

要按
附件进行排序
您需要确保类实现
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
    }
}
试试这个样品

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;
}
private static IEnumerable GetCars(字符串filterByAccessory,bool sortAscending=true)
{
var cars=新列表();
汽车,加上(
新车
{
Name=“CAR1”,
附件=新列表()
{
新附件(){Name=“ABS Brakes”,Value=“1”},
新附件(){Name=“Airbag”,Value=“1”},
新附件(){Name=“Climate Control”,Value=“1”},
新附件(){Name=“加热型座椅”,Value=“1”},
N