C# 按2个属性对模型列表进行排序
我正在尝试对如下对象列表进行排序:C# 按2个属性对模型列表进行排序,c#,sorting,C#,Sorting,我正在尝试对如下对象列表进行排序: products.Sort((a, b) => { var x = string.CompareOrdinal(a.SelectToken("model").ToString(), b.SelectToken("model").ToString()); var z = string.CompareOrdinal(b.SelectToken("colour").ToString(), colour); return x > 0
products.Sort((a, b) =>
{
var x = string.CompareOrdinal(a.SelectToken("model").ToString(), b.SelectToken("model").ToString());
var z = string.CompareOrdinal(b.SelectToken("colour").ToString(), colour);
return x > 0 ? z : x;
});
[{
colour: 'Any'
},{
colour: 'Any'
},{
colour: 'Any'
},{
colour: 'Black'
},{
colour: 'Black'
},{
colour: 'Pink'
}]
然后我想反向遍历列表,以便删除重复项:
// Loop through products in reverse
for (var i = products.Count() - 1; i >= 0; i--)
{
// Get our product
var product = products[i];
// Get our product colour
var productColour = product.SelectToken("colour").ToString();
// If our colour is black
if (colour == "Black")
{
// If the product colour is not black, remove the duplicate product
if (!productColour.Equals(colour))
products.RemoveAt(i);
}
else
{
// Get our product model
var productModel = product.SelectToken("model").ToString();
// If we are the same model but a different colour, remove the duplicate
if (productModel.Equals(model) && !productColour.Equals(colour))
products.RemoveAt(i);
// Update our variable
model = productModel;
}
}
但这并不是那么简单。
color变量默认为“黑色”,但实际上可以设置为任何颜色。因此,我想先按模型排序,然后按颜色排序,但我希望它能像这样对颜色进行排序。如果颜色为“粉色”,则列表应如下所示:
products.Sort((a, b) =>
{
var x = string.CompareOrdinal(a.SelectToken("model").ToString(), b.SelectToken("model").ToString());
var z = string.CompareOrdinal(b.SelectToken("colour").ToString(), colour);
return x > 0 ? z : x;
});
[{
colour: 'Any'
},{
colour: 'Any'
},{
colour: 'Any'
},{
colour: 'Black'
},{
colour: 'Black'
},{
colour: 'Pink'
}]
因此,基本上,如果选择的颜色不是黑色,它应该位于排序的底部,后面紧跟着黑色(所有其他颜色都在这两种颜色之前)。如果所选颜色为黑色,则黑色应位于列表底部。
有人能帮我解决这个问题吗
仅供参考,这是将被排序的项目之一的示例:
{
"id": 3797,
"title": "Canon EOS 100D Digital SLR Camera with 18-55 IS STM Lens, HD 1080p, 18MP, 3\" LCD Touch Screen",
"shortTitle": "Canon EOS 100D Black",
"brand": "Canon",
"model": "EOS 100D",
"colour": "Black",
"gtin": "8714574602721",
"image": "http://piiick.blob.core.windows.net/images/Canon-EOS-100D-18-55-Black-8714574602721.png",
"type": "Digital SLR",
"lensFocalLength": "18-55",
"lensType": "IS STM",
"lensMount": "EF/EF-S",
"maxAperture": "999",
"connectivity": "",
"shootingModes": "Scene Intelligent Auto (Stills and Movie), No Flash, Creative Auto, Portrait, Landscape, Close-up, Sports, SCN(Kids, Food, Candlelight, Night Portrait, Handheld Night Scene, HDR Backlight Control), Program AE , Shutter priority AE, Aperture priority AE, Manual (Stills and Movie)",
"weight": 410.0,
"width": 116.8,
"height": 90.7,
"depth": 69.4,
"digitalZoom": "N/A",
"opticalZoom": "N/A",
"waterproof": false,
"maxVideoResolution": "1920 x 1080",
"sensorType": "CMOS",
"sensorSize": "22.3 x 14.9 mm",
"continuousShootingSpeed": "4",
"iso": "1600",
"style": "traditional",
"designer": "",
"dateAnnounced": "10/06/2008",
"focusPoints": 7
}
产品完全可能没有黑色或所选颜色,但我不想将其从列表中删除(只是复制型号)。您的排序算法应该更改,以适合您的需要。 我所了解的是,您按型号排序,然后在相同型号中按颜色排序,但
selectedColor
应位于底部。但是,黑色应该位于选定颜色的正上方。我认为删除重复项不应该是个问题
必要时交换1和-1
products.Sort((a, b) =>
{
var x = string.CompareOrdinal(a.SelectToken("model").ToString();
If (x!=0) return x;
if (a.color == selectedColor){
return 1
}
if (b.color == selectedColor){
return -1
}
if (a.color == "black") {
return 1
}
if (b.color == "black") {
return -1
}
return string.CompareOrdinal(b.SelectToken("colour").ToString(), colour);
});
如果您的目的是删除重复项,为什么不使用groupby呢
string str = @"[{'model':'aaa', 'colour':'red'}
,{'model':'aaa', 'colour':'red'}
,{'model':'aaa', 'colour':'green'}
,{'model':'bbb', 'colour':'red'}]";
JArray allProducts = JArray.Parse(str);
//Get the first product of each group
var uniq = allProducts
.GroupBy(x => new { model = x["model"], colour = x["colour"] })
.Select(x => x.First())
.ToList();
或按所选颜色过滤,添加where子句
string colour = "red";
var uniq = allProducts
.GroupBy(x => new { model = x["model"], colour = x["colour"] })
.Select(x => x.First())
.Where(x => x["colour"].Value<string>() == colour)
.ToList();
string color=“red”;
var uniq=所有产品
.GroupBy(x=>new{model=x[“model”],color=x[“color”]})
.Select(x=>x.First())
.其中(x=>x[“颜色”].Value()==颜色)
.ToList();
试试userxs.OrderBy(x=>…)。然后再(x=>…)
你做的工作比需要的要多。另外,可以使用xs.GroupBy(x=>…)
OrderBy(),删除重复项。ThenBy()
将不起作用,因为我需要在底部加黑色(如果选择的颜色不是黑色)。如果选择的颜色是黑色,它就可以正常工作。另外,GroupBy
也不起作用,因为可能是某些型号没有黑色或选定的颜色。您可以编写一个自定义键比较,将黑色放在开头。我认为您应该更改排序逻辑。如果产品相同,请检查所选颜色是否为黑色,如果是,请返回-1或1使其移动到底部。如果所选颜色不是黑色,则检查产品是否为所选颜色,并将其移至底部。如果产品颜色再次为黑色,请移至底部