[解決済み] LINQでリストの重複をカウントする方法
質問
アイテムのリストがあります
- ジョンID
- マットID
- ジョンID
- スコットID
- マットID
- ジョンID
- ルーカス ID
私はそれらをこのようにリストに戻したいのですが、それはまた、重複の数が多い順に並べ替えたいことを意味します。
- ジョンID 3
- マット ID 2
- スコット ID 1
- ルーカス ID 1
LINQとC#でどうやったらいいのか教えてください。
ありがとうございます。
EDIT 2 コードを表示します。
List<game> inventory = new List<game>();
drinkingforDataContext db = new drinkingforDataContext();
foreach (string item in tbTitle.Text.Split(' '))
{
List<game> getItems = (from dfg in db.drinkingfor_Games
where dfg.game_Name.Contains(tbTitle.Text)
select new game
{
gameName = dfg.game_Name,
gameID = Boomers.Utilities.Guids.Encoder.EncodeURLs(dfg.uid)
}).ToList<game>();
for (int i = 0; i < getItems.Count(); i++)
{
inventory.Add(getItems[i]);
}
}
var items = (from xx in inventory
group xx by xx into g
let count = g.Count()
orderby count descending
select new
{
Count = count,
gameName = g.Key.gameName,
gameID = g.Key.gameID
});
lvRelatedGames.DataSource = items;
lvRelatedGames.DataBind();
このクエリでは、このような結果が表示されます。
- 1 ハローワールド回数
- 1ハローワールド回数
- 1 ハローワールド
- 1 ハローワールド回
- 1ハローワールド回
- 1ハローワールド回
- 1 ハローワールド
- 1 ハローワールド回
回数と名前は出るのですが、ゲームのIDが出ません...。
表示されるはずです。
- 6 ハローワールドタイム 234234
- 2 ハローワールド 23432432
どのように解決するのですか?
group by" + "orderby" を使用することができます。参照 LINQ 101 を参照してください。
var list = new List<string> {"a", "b", "a", "c", "a", "b"};
var q = from x in list
group x by x into g
let count = g.Count()
orderby count descending
select new {Value = g.Key, Count = count};
foreach (var x in q)
{
Console.WriteLine("Value: " + x.Value + " Count: " + x.Count);
}
に対して この投稿 (現在は削除されています)。
もし、いくつかのカスタムオブジェクトのリストがある場合、そのリストには カスタム比較器 を使うか、特定のプロパティでグループ化する必要があります。
また、クエリは結果を表示することができません。私たちはより良い助けを得るために完全なコードを表示します。
最新のアップデートに基づいています。
このようなコード行がありますね。
group xx by xx into g
xxはカスタムオブジェクトなので、システムはある項目を別の項目と比較する方法を知りません。 すでに書いたように、コンパイラを誘導してオブジェクトの比較に使われるプロパティを提供するか、カスタムの比較器を提供する必要があります。以下はその例です。
私は Foo.Name の値に基づいてグループ化されます。 名前 プロパティの値に基づいてグループ化されます。
名前に基づいて2つのオブジェクトを重複して扱いますが、Idについてはどうでしょうか?私の例では、グループ内の最初のオブジェクトのIDを取るだけです。もし、オブジェクトのIDが異なる場合、問題になる可能性があります。
//Using extension methods
var q = list.GroupBy(x => x.Name)
.Select(x => new {Count = x.Count(),
Name = x.Key,
ID = x.First().ID})
.OrderByDescending(x => x.Count);
//Using LINQ
var q = from x in list
group x by x.Name into g
let count = g.Count()
orderby count descending
select new {Name = g.Key, Count = count, ID = g.First().ID};
foreach (var x in q)
{
Console.WriteLine("Count: " + x.Count + " Name: " + x.Name + " ID: " + x.ID);
}
関連
-
[解決済み] LINQを使用してList<T>から要素を削除する
-
[解決済み] C# LINQ リスト内の重複を検索する
-
[解決済み] enumを列挙するには
-
[解決済み] intをenumにキャストするにはどうすればよいですか?
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] LINQのGroup by
-
[解決済み] DataTableに対するLINQクエリ
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] LINQ集計アルゴリズム説明
-
[解決済み] LINQを使用してList<string>内のすべての文字列を結合する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】値が期待した範囲に収まらない
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】IntPtrとは一体何なのか?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。