こんにちは。今回もよろしくお願いします。
前提・実現したいこと
2つのListを突合し、1つ目のリストに足りない項目を2つ目のリストからAddして補完する
関数を作成しましたが、実行時エラーによりプログラムが停止してしまいます。
原因はある程度特定できたと思うのですが、解決方法が分かりません。
<Listの構造>
突合したいList(第1引数)は、LINQにて作成しました。下図のような構成になっています。
突合したいList(第2引数)も同じ構成ですが、.result.Choiseの内容が一部異なります。
下図のように、赤丸の部分が第1引数にない項目のため、第1引数の.resultにAddし、戻り値として第1引数を返します。
該当のソースコード
C#
1 private List<dynamic> List_Comp(List<dynamic> target ,List<dynamic> reference) 2 { 3 4 int list_count = 0; 5 bool Contains_flg = false; 6 foreach (dynamic dy in reference) 7 { 8 foreach (var item in dy.result) 9 { 10 Contains_flg = false; 11 foreach (var it in target[list_count].result) 12 { 13 if(item.Choise == it.Choise) 14 { 15 Contains_flg = true; 16 } 17 } 18 if(Contains_flg == false) 19 { 20 // 選択肢の追加 21 // 実行時エラー 22 target[list_count].result.Add(new { Choise = item.Choise.ToString(), Count = 0 }); 23 24 // 試したこと① 正常にListのresultにAddされた 25 // target[list_count].result.Add(new { Choise = "aaa", Count = 0 }); 26 // 試したこと② 正常にメッセージ"aaa"が表示された 27 // MessageBox.Show(item.Choise); 28 } 29 } 30 list_count++; 31 } 32 33 return (target); 34 } 35
発生している問題・エラーメッセージ
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ''System.Collections.Generic.List<<>f__AnonymousType0<string,int>>.Add(<>f__AnonymousType0<string,int>)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています'
原因の考察
試したこと①から、そもそもエラーがでた行の全体的な記述は間違ってないことは分かりました。
また、固定値でのAddなら動作したため、Choise = item.Choise.ToString()の部分が問題であることは特定できました。
試したこと②から、item.Choise自体はきちんと取得できていることは分かりました。
エラーメッセージの内容から、itemが匿名型のためitem.Choiseの.Choiseをメソッドとコンパイラが勘違いしているのでは?と思っています。
上記から、itemが匿名型であることが問題で、2回目のforeachのvarを何かしらに変更すればきちんと動作するのではと考えましたが、具体的対策が思いつきません。
完全独学なので、突っ込みどころ満載かと思いますがビシビシ突っ込んでもらえるとありがたいです。
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio Community 2017
Version 15.7.3
VisualStudio.15.Release/15.7.3+27703.2026
Microsoft .NET Framework
Version 4.7.03190
サンプルプログラム(2019年10月31日13時43分追記)
再現しないとご指摘があったため、List生成から呼び出しまでのサンプルプログラムを作成しました。
渡しの環境では以下プログラムで同じエラーが発生します。
C#
1using System.Collections.Generic; 2using System.Linq; 3 4namespace ConsoleApp3 5{ 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 11 List<string[]> data1 = new List<string[]>(); 12 List<string[]> data2 = new List<string[]>(); 13 14 List<dynamic> agg1 = new List<dynamic>(); 15 List<dynamic> agg2 = new List<dynamic>(); 16 17 data1.Add(new string[4] { "1", "2", "3", "4" }); 18 data1.Add(new string[4] { "2", "2", "3", "4" }); 19 data1.Add(new string[4] { "3", "2", "3", "4" }); 20 21 data2.Add(new string[4] { "1", "2", "3", "4" }); 22 data2.Add(new string[4] { "2", "2", "3", "4" }); 23 data2.Add(new string[4] { "3", "2", "3", "4" }); 24 data2.Add(new string[4] { "aaa", "2", "3", "4" }); 25 26 int item_count = 0; 27 for (int j = 0; j < 2; j++) 28 { 29 30 agg1.Add(new 31 { 32 title = j.ToString(), 33 result = data1.GroupBy(x => x[item_count]) 34 .Select(x => new { Choise = x.Key, Count = x.Count() }) 35 .OrderBy(x => x.Choise).ToList() 36 }); 37 38 item_count++; 39 40 } 41 42 item_count = 0; 43 for (int j = 0; j < 2; j++) 44 { 45 46 agg2.Add(new 47 { 48 title = j.ToString(), 49 result = data2.GroupBy(x => x[item_count]) 50 .Select(x => new { Choise = x.Key, Count = x.Count() }) 51 .OrderBy(x => x.Choise).ToList() 52 }); 53 54 item_count++; 55 56 } 57 58 59 agg1 = List_Comp(agg1, agg2); 60 61 62 63 64 } 65 private static List<dynamic> List_Comp(List<dynamic> target, List<dynamic> reference) 66 { 67 68 int list_count = 0; 69 bool Contains_flg = false; 70 foreach (dynamic dy in reference) 71 { 72 foreach (var item in dy.result) 73 { 74 Contains_flg = false; 75 foreach (var it in target[list_count].result) 76 { 77 if (item.Choise == it.Choise) 78 { 79 Contains_flg = true; 80 } 81 } 82 if (Contains_flg == false) 83 { 84 // 選択肢の追加 85 // 実行時エラー 86 target[list_count].result.Add(new { Choise = item.Choise, Count = 0 }); 87 } 88 } 89 list_count++; 90 } 91 92 return (target); 93 } 94 95 96 97 } 98 99 100} 101
回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/31 04:48
2019/10/31 05:40 編集
2019/10/31 05:33
2019/10/31 07:23