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)
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