コレクションとforeachについて
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 3,342
前提・実現したいこと
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>)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。
該当のソースコード
機能を縮小させたソースコードです
using System;
using System.Collections.Generic;
using System.Linq;
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 void PrintOut()
{
int row = 0;
int column = 0;
foreach (var key in key_id)
{
foreach (var Collection in mlist(key))
{
OutPut(PrintData(Collection));
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(List<MEMBER> member)
{
List<Object> result = new List<object>();
foreach (var opdata in member)
{
result.Add(opdata.no);
result.Add(opdata.no);
result.Add(opdata.name_1st);
result.Add(opdata.name_2nd);
result.Add(opdata.tel_no);
}
return result.ToArray();
}
}
試したこと
foreachや型変換にこだわりはなく、List<MEMBER>のようなデータを1行ずつ取り出し、出力する方法を探しています。
補足情報(言語/FW/ツール等のバージョンなど)
C# MVC .NET Framework EPPlus
必要な情報が足りないようでしたら教えてください。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+3
こんにちは.
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)) のループは不要です.
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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();
}
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/31 16:23 編集
縮小したソースコードでは該当エラーはなくなりました。
せっかくご回答いただけたのですが、私の作り方が悪かったようで、実際のコードのほうではうまくできていないので、縮小したソースコードのほうを実際のコードの問題になっているところに近づけてみます。
また、foreachで繰り返しを行わないと、1行だけになってしまうかと思います。
縮小化したコードでは実際に行っていませんが、1行の各項目をA列からずらしながら出力し、次の行に出力するときはまた列Aから出力するクラスを使おうと思ってます。
今回のソースをもとにすると、targetが1だけの場合は3行、1,2とある場合は、6行のList<MEMBER>コレクションができるため、それをもとに出力を考えています。
2016/05/31 16:51
ただ、上記のやり方ではやはり1行しか出力されませんでした。
質問の内容を複数行で出力したいという形の内容にしますので、今回のエラーに関する質問はこれにてクローズさせていただきます。
ありがとうございました。
2016/05/31 18:49