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

试试user
xs.OrderBy(x=>…)。然后再(x=>…)
你做的工作比需要的要多。另外,可以使用
xs.GroupBy(x=>…)
OrderBy(),删除重复项。ThenBy()
将不起作用,因为我需要在底部加黑色(如果选择的颜色不是黑色)。如果选择的颜色是黑色,它就可以正常工作。另外,
GroupBy
也不起作用,因为可能是某些型号没有黑色或选定的颜色。您可以编写一个自定义键比较,将黑色放在开头。我认为您应该更改排序逻辑。如果产品相同,请检查所选颜色是否为黑色,如果是,请返回-1或1使其移动到底部。如果所选颜色不是黑色,则检查产品是否为所选颜色,并将其移至底部。如果产品颜色再次为黑色,请移至底部