我有一个包含类别列表的列表,在这些类别中也是一个包含产品的列表。
我想订购某些产品类别的产品,如鸡蛋,牛奶,水,冰
这就是我所拥有的:
foreach (var cat in data.List)
{
if (cat.Id == "ProductType1")
{
cat.Modules.OrderBy(f => f.ProdType == "Eggs").
ThenBy(f => f.ProdType == "Milk");
}
}
但是这不起作用,如果我有更长的prodtype列表,那么写下来会有很多代码
答案 0 :(得分:2)
在代码中尝试使用内联if语句来设置排序键:
foreach (var cat in data.List)
{
if (cat.Id == "ProductType1")
{
cat.Modules.OrderBy(f =>
f.ProdType == "Eggs" ? 1 : f.ProdType=="Milk" ? 2 : 3 );
}
}
修改强>
如果您有很长的查找列表,则可以改用开关:
foreach (var cat in data.List)
{
if (cat.Id == "ProductType1")
{
cat.Modules.OrderBy (s =>
{
int i = 0;
switch(s)
{
case "Eggs": i=1; break;
case "Milk": i=2; break;
case "Water": i=3;break;
default: i=4; break;
}
return i;
});
}
}
答案 1 :(得分:0)
OrderBy需要一个密钥(在这种情况下是属性),它会对集合进行排序,因此您错误地使用它。我能想到的一种方式就像下面的
var result = cat.Modules.Where(f => f.ProdType == "Eggs")
.Union(cat.Modules.Where(f => f.ProdType == "Milk"))
.Union(cat.Modules.Where(f => f.ProdType == "Water")).ToList();
答案 2 :(得分:0)
问题不是很清楚,但这可能就是你正在寻找的形式
var orderDict = new Dictionary<string, int>{
{"Eggs", 0},
{"Milk", 1},
{"Water", 2}
}
var sortedbyCat =data.List.OrderBy(g => orderDict[g.Key]);
答案 3 :(得分:0)
cat.Modules.Sort((a, b) => a.ProdType.CompareTo(b.ProdType));
这将按ProdType