1. ホーム
  2. c#

[解決済み] LINQでリストの重複をカウントする方法

2023-08-02 16:12:46

質問

アイテムのリストがあります

  • ジョン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);
}