2017-06-01 7 views
0

でモデルのリストを並べ替え:私はこのようなオブジェクトのリストをソートしようとしています2つのプロパティ

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

と私は重複を削除することができますので、私は逆に、リストをループにしたい:

// 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; 
    } 
} 

しかし、それだけでは簡単ではありません。 の変数は、デフォルトでは「黒」ですが、実際にどの色に設定することもできます。だから、私はのモデルを最初に並べ替え、次にの色をで並べ替えたいが、このような色を並べ替えるようにしたいと思う。色は「ピンク」である場合、リストは次のようにする必要があります:

[{ 
    colour: 'Any' 
},{ 
    colour: 'Any' 
},{ 
    colour: 'Any' 
},{ 
    colour: 'Black' 
},{ 
    colour: 'Black' 
},{ 
    colour: 'Pink' 
}] 

をだから、基本的には、選択した色が黒でない場合、それは一種の一番下にあることと、直接(他のすべての色を黒に続く必要がありますこれらの2つの前に来てください)。選択した色が黒の場合、黒はリストの一番下に表示されます。 誰かがこれで私を助けることができますか?

情報だけのために、これはソートされる項目の一つの例である:生成物が黒色の色または選択された色を有していなくてもよいことは全く可能である

{ 
    "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 
} 

、私それを私のリストから削除したくない(重複モデルのみ)。

+0

トライユーザー 'xs.OrderBy(X => ...)。ThenBy(X => ...)'あなたがどこにいる追加必要以上に多くの仕事をしています。また、 'xs.GroupBy(x => ...) 'を使って重複を取り除くこともできます。 –

+0

OrderBy()。ThenBy()'は黒の前に色が必要なので動作しません。選択された色は黒ではない)。選択した色が黒でもうまくいくはずです。また、 'GroupBy'は、一部のモデルが黒や選択された色を持たないかもしれないので動作しません。 – r3plica

+0

Blackを先頭に置くカスタムキー比較を書くことができます。 –

答えて

1

あなたのソートアルゴリズムは、あなたが望むものに合うように変更する必要があります。 私が理解したところでは、モデル別にソートし、同じモデル間で色分けしますが、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); 
}); 
0

あなたの意図が重複を削除する場合は、単に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(); 

または選択した色によってフィルタリングする、句

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(); 
関連する問題