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

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

新規登録して質問してみよう
ただいま回答率
85.48%
foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

C#

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

Q&A

解決済

2回答

5034閲覧

コレクションとforeachについて

DinKa

総合スコア40

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

C#

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

0グッド

0クリップ

投稿2016/05/31 07:04

###前提・実現したいこと
Object[]型への変換エラーについてです。
List<T>型のコレクションをforeachで1行づつ取り出して、Excelに出力しようと思っています。

EPPlus.dllというライブラリを利用して出力する既存クラスがあるため、
そのクラスの型が、Object[]型になっています。
集めたデータは、List<T>型なので、Object[]型と一致しないためエラーが発生しています。
このデータをExcelに出力しようと考えていますが、Object[]型へのキャスト?
あるいは代入の仕方を教えていただければと思います。

実際には簡単な方法があるのかもしれませんが、残念ながら思いつきませんでした。

###発生している問題・エラーメッセージ

以下は、機能を縮小させて発生したエラーメッセージです。

エラー 2 引数 1: 'MEMBER' から 'System.Collections.Generic.List<MEMBER>' に変換できません エラー 1 'AAA.PrintData(System.Collections.Generic.List<MEMBER>)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。

###該当のソースコード

機能を縮小させたソースコードです

C#

1using System; 2using System.Collections.Generic; 3using System.Linq; 4 5 6public partial class MEMBER 7{ 8 public string no { get; set; } 9 public string id { get; set; } 10 public string name_1st { get; set; } 11 public string name_2nd { get; set; } 12 public string tel_no { get; set; } 13} 14 15public class Key 16{ 17 public Key(string id) 18 { 19 this.target = id; 20 } 21 public string target {get; set; } 22} 23 24class AAA 25{ 26 public List<Key> key_id = new List<Key>(); 27 28 private static List<MEMBER> mlist(Key key_id) 29 { 30 List<MEMBER> Member = new List<MEMBER> { 31 new MEMBER { no = "0001", id = "1" ,name_1st = "あいう", name_2nd = "えお", tel_no = "0123450000"}, 32 new MEMBER { no = "0002", id = "1" ,name_1st = "かきく", name_2nd = "けこ", tel_no = "0123451111"}, 33 new MEMBER { no = "0003", id = "1" ,name_1st = "たちつ", name_2nd = "てと", tel_no = "0123452222"}, 34 new MEMBER { no = "0001", id = "2" ,name_1st = "あいう", name_2nd = "えお", tel_no = "09012340000"}, 35 new MEMBER { no = "0002", id = "2" ,name_1st = "かきく", name_2nd = "けこ", tel_no = "09012341111"}, 36 new MEMBER { no = "0003", id = "2" ,name_1st = "たちつ", name_2nd = "てと", tel_no = "09012342222"}, 37 }; 38 return Member; 39 } 40 41 public void PrintOut() 42 { 43 int row = 0; 44 int column = 0; 45 foreach (var key in key_id) 46 { 47 foreach (var Collection in mlist(key)) 48 { 49 OutPut(PrintData(Collection)); 50 row++; 51 } 52 } 53 } 54 55 private Object[] OutPut(Object[] print) 56 { 57 List<Object> result = new List<object>(); 58 result.Add(print[0]); 59 int j = 10; 60 for (int i = 1; i <= j; i++) 61 { 62 result.Add(print[i]); 63 } 64 return result.ToArray(); 65 } 66 private Object[] PrintData(List<MEMBER> member) 67 { 68 List<Object> result = new List<object>(); 69 foreach (var opdata in member) 70 { 71 result.Add(opdata.no); 72 result.Add(opdata.no); 73 result.Add(opdata.name_1st); 74 result.Add(opdata.name_2nd); 75 result.Add(opdata.tel_no); 76 } 77 return result.ToArray(); 78 } 79}

###試したこと
foreachや型変換にこだわりはなく、List<MEMBER>のようなデータを1行ずつ取り出し、出力する方法を探しています。

###補足情報(言語/FW/ツール等のバージョンなど)
C# MVC .NET Framework EPPlus
必要な情報が足りないようでしたら教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは.

Object型配列を生成し,そこにMEMBERリストから取り出した要素を追加して,Object型配列を満たす事は出来ています.
エラー原因はPrintDataの引数の型が一致していない事です.
Collectionを渡していますが,Collectionはforeachで取り出された要素型なので,MEMBER型になっています.
つまり分かりやすく書くと,
foreach (MEMBER Collection in mlist(key))
です.
※ varは便利ですがコードを読みにくくしてしまうことがあるので,そんな時は型を明示的に書く方が有効です.

したがって,

OutPut(PrintData(mlist(key)));

とすればエラーは解消できると思います.
この場合,foreach (var Collection in mlist(key)) のループは不要です.

投稿2016/05/31 07:13

編集2016/05/31 07:22
shironegi

総合スコア119

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

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

DinKa

2016/05/31 07:37 編集

お早い回答ありがとうございます。 縮小したソースコードでは該当エラーはなくなりました。 せっかくご回答いただけたのですが、私の作り方が悪かったようで、実際のコードのほうではうまくできていないので、縮小したソースコードのほうを実際のコードの問題になっているところに近づけてみます。 また、foreachで繰り返しを行わないと、1行だけになってしまうかと思います。 縮小化したコードでは実際に行っていませんが、1行の各項目をA列からずらしながら出力し、次の行に出力するときはまた列Aから出力するクラスを使おうと思ってます。 今回のソースをもとにすると、targetが1だけの場合は3行、1,2とある場合は、6行のList<MEMBER>コレクションができるため、それをもとに出力を考えています。
DinKa

2016/05/31 07:51

すみません、私の勘違いだったようで、エラー自体は実際のコードでもなくなりました。 ただ、上記のやり方ではやはり1行しか出力されませんでした。 質問の内容を複数行で出力したいという形の内容にしますので、今回のエラーに関する質問はこれにてクローズさせていただきます。 ありがとうございました。
DinKa

2016/05/31 09:49

複数行で出力する件は、何とか自力で解決できましたので、自己解決方法にソースを載せておきます。
guest

0

using System; using System.Collections.Generic; using System.Linq; using System.IO; public partial class MEMBER { public string no { get; set; } public string id { get; set; } public string name_1st { get; set; } public string name_2nd { get; set; } public string tel_no { get; set; } } public class Key { public Key(string id) { this.target = id; } public string target {get; set; } } class AAA { public List<Key> key_id = new List<Key>(); private static List<MEMBER> mlist(Key key_id) { List<MEMBER> Member = new List<MEMBER> { new MEMBER { no = "0001", id = "1" ,name_1st = "あいう", name_2nd = "えお", tel_no = "0123450000"}, new MEMBER { no = "0002", id = "1" ,name_1st = "かきく", name_2nd = "けこ", tel_no = "0123451111"}, new MEMBER { no = "0003", id = "1" ,name_1st = "たちつ", name_2nd = "てと", tel_no = "0123452222"}, new MEMBER { no = "0001", id = "2" ,name_1st = "あいう", name_2nd = "えお", tel_no = "09012340000"}, new MEMBER { no = "0002", id = "2" ,name_1st = "かきく", name_2nd = "けこ", tel_no = "09012341111"}, new MEMBER { no = "0003", id = "2" ,name_1st = "たちつ", name_2nd = "てと", tel_no = "09012342222"}, }; return Member; } public static void Main() { PrintOut(); } public static void PrintOut() { List<Key> key_id = new List<Key>(); //Print(); } public void Print() { int row = 0; foreach (Key key in key_id) { foreach (MEMBER Collection in mlist(key)) { OutPut(PrintData(Collection)); //NewCell(); row++; } } } private Object[] OutPut(Object[] print) { List<Object> result = new List<object>(); result.Add(print[0]); int j = 10; for (int i = 1; i <= j; i++) { result.Add(print[i]); } return result.ToArray(); } private Object[] PrintData(MEMBER member) { List<Object> result = new List<object>(); result.Add(member.no); result.Add(member.no); result.Add(member.name_1st); result.Add(member.name_2nd); result.Add(member.tel_no); return result.ToArray(); } }

投稿2016/05/31 09:52

編集2016/05/31 09:56
DinKa

総合スコア40

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問