2

約 500,000 のアイテムを含むコレクションを使用して、すべての重複を取得する適切な方法を探しています。この投稿を読んだ後、最も一般的な解決策はハッシュ セットを使用することであることがわかりました。しかし、Car4 と Car5 だけでなく、赤色のすべての Car を取得したい場合はどうすればよいでしょうか。

Car1.Color = Red;

Car2.Color = Blue;

Car3.Color = Green;

Car4.Color = Red;

Car5.Color = Red;

問題を考えると、これを行うための合理的に速い方法は何ですか?

編集: その投稿で、以下のコードを自分のニーズに合わせて簡単に変更できることがわかりました。そして、問題を解決するためのより良い方法があるかどうかはわかりませんが、見るためだけに投稿を残します.

var duplicates = from car in cars
                 group car by car.Color into grouped
                 from car in grouped
                 select car;
4

3 に答える 3

9

Enumerable.ToLookup拡張メソッドを使用して、車を色でグループ化し、1つの色のすべての車を取得できます。

var cars = new List<Car> { car1, car2, car3, car4, car5 };
var lookup = cars.ToLookup(car => car.Color);
var redCars = lookup[Red];
// redCars == { car1, car4, car5 }
于 2012-06-08T14:25:09.893 に答える
1

groupby値を使用できます

class Car {
    public Color { get; set; }
}

void Main()
{
     List<Car> cars = GetList(); // not important
     var grouped = cars.GroupBy(c=>c.Color);
     var duplicates = cars.Where(g=>g.Count()>1);

}
于 2012-06-08T14:27:26.027 に答える
0

ディクショナリを使用して、さまざまなルックアップテーブルの作成を検討できます。たとえば、Car.Colorでルックアップを実行する場合は、Dictionary>があるため、新しい車を追加するたびに、Colorディクショナリも追加します。

これには、より高速なルックアップの恩恵を受けるために、追加のメモリ使用量と追加時間のトレードオフがあり、同じキーフィールドで車のコレクションをルックアップする場合にのみ最も意味があります。

それ以外の場合は、Enumerable.ToLookup()を使用する方法があります。ToLookup()がどのように機能するかの説明については、このリンクを参照してください。

http://msdn.microsoft.com/en-us/library/bb549073.aspx

于 2012-06-08T14:28:43.233 に答える