質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

3193閲覧

C#のLINQを使用して、IDictionary<string, Dictionary<int, string>>のようなデータを取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2020/05/04 02:10

編集2020/05/04 02:26

前提・実現したいこと

C#のLINQを使用して、IDictionary<string, Dictionary<int, string>>のようなデータを取得したいです。
Dictionaryの部分は匿名型になるかもしれません。

目的としてはjavacriptライブラリのComboBoxで、下記のデータ形式が必要なため、あらかじめデータ加工しておきたいことです。

(取得したいデータ)

txt

10: Key: "グループ1" 2 Value: 0: {Key: 1, Value: "TEST1"} 3 1: {Key: 2, Value: "TEST2"}

(Model)

C#

1public class Member { 2 public int Id { get; set; } 3 public string Name { get; set; } 4 public string GroupName { get; set; } 5}

ご教授お願いします。

発生している問題

該当のソースコードでは下記のデータまで取得できますが、グループ化がうまくできなくて困ってます。

(現在のgroupMembersのデータ)

txt

10: Key: "グループ1" 2 Value: {Key: 1, Value: "TEST1"} 31: Key: "グループ1" 4 Value: {Key: 2, Value: "TEST2"}

該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5public class Member { 6 public int Id { get; set; } 7 public string Name { get; set; } 8 public string GroupName { get; set; } 9} 10 11public class Test { 12 Test() { 13 IList<Member> members = new List<Member>(); 14 members.Add(new Member() { Id = 1, Name = "TEST1", GroupName = "グループ1" }); 15 members.Add(new Member() { Id = 2, Name = "TEST2", GroupName = "グループ1" }); 16 17 IReadOnlyDictionary<int, string> memberDictionaries = members.ToDictionary( 18 e => e.Id, 19 e => e.Name 20 ); 21 22 var groupMembers = members 23 .GroupJoin(memberDictionaries, a => a.Id, b => b.Key, (a, b) => new { a, b }) 24 .SelectMany(x => x.b.DefaultIfEmpty(), (a, b) => new { 25 Key = a.a.GroupName, 26 Value = b 27 }); 28 } 29}

試したこと

ToLookup等も試してみたがうまく取得できなかった。

補足情報(FW/ツールのバージョンなど)

.NET Framework 4.7.1
Visual Studio Express 2012 for Web
ASP.NET MVC5(C#)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんなのかな?

C#

1var members = new List<Member> 2{ 3 new Member { Id = 1, Name = "TEST1", GroupName = "グループ1" }, 4 new Member { Id = 2, Name = "TEST2", GroupName = "グループ1" } 5}; 6 7var anser = members 8 .GroupBy(m => m.GroupName) 9 .ToDictionary(g => g.Key, g => 10 g.GroupBy(m => m.Id).ToDictionary(g2 => g2.Key, g2 => g2.First().Name));

投稿2020/05/04 03:08

hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/04 03:23 編集

コメントありがとうございます。 教えて頂いた方法で実現できました。 ちょうど似たようなコードをネットで見つけたのですが、Firstが使われていなかったので、うまくいきませんでした。 Firstは最初の要素を取得するみたいですが、デバッグでその理由を検証できていなく、 もしわかれば教えて頂きたく。
hihijiji

2020/05/04 03:29

この場合のFirst は任意の一つさえ取れればいいのでLast でもなんでもいいです。 ToDictionary を使うときは GroupBy とセットみたいなものなので 定型文みたいに覚えてもいいかもしれません。
退会済みユーザー

退会済みユーザー

2020/05/04 03:34

なるほど、了解しました。 よく使うパターンになりそうなので、ToDictionaryのGroupBy時の定型文として使うようにしたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問