C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 配列のコピーについて


(過去ログ 130 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■76987 / inTopicNo.1)  配列のコピーについて
  
□投稿者/ ミーアキャット (12回)-(2015/09/03(Thu) 13:29:57)

分類:[.NET 全般] 

2015/09/03(Thu) 13:36:41 編集(投稿者)
2015/09/03(Thu) 13:35:47 編集(投稿者)
2015/09/03(Thu) 13:35:43 編集(投稿者)

以下のコードにて
slst は olst にコピーされたのですが

olst から newslst へのコピーができません。

どうしてでしょう?
また、ループする以外にコピーする方法はあるのでしょうか?

string[] slst = { "AAA", "BBB", "CCC" };
object[] olst = slst.ToArray();
olst[1] = "bbb";


string[] newslst = (string[])olst.ToArray();

ループを使うとコピーは可能

string[] newslst = new string[olst.Count()];
for(int inum = 0; inum < olst.Count(); inum++)
{
 newslst[inum] = olst[inum].ToString();
}
引用返信 編集キー/
■76988 / inTopicNo.2)  Re[1]: 配列のコピーについて
□投稿者/ 魔界の仮面弁士 (479回)-(2015/09/03(Thu) 13:44:12)
2015/09/03(Thu) 15:19:07 編集(投稿者)

No76987 (ミーアキャット さん) に返信
> どうしてでしょう?
そもそも、
 object[] o1 = new string[] { "AAA", "bbb", "CCC" };
 string[] s1 = (string[])o1;

 object[] o2 = new object[] { "aaa", "BBB", "ccc" };
 string[] s2 = (string[])o2;
の場合、s1 は成功しますが、s2 は失敗します。


今回の場合、olst は object[] ですが、中身は string[] ですから、
コピー無しで、単にキャストするだけならば可能です。

string[] ok = (string[])olst; // 上記 s1 と同じ理由で成功
string[] ng = (string[])olst.ToArray(); // 上記 s2 と同じ理由で失敗



なお、ToArray 拡張メソッドは、配列に対して用意されているわけではなく、
IEnumerable<T> に対して用意されたものです。


 // ○これらはOK
 string[] ok1 = Enumerable.ToArray<string>((IEnumerable<string>)olst);
 string[] ok2 = ((IEnumerable<string>)olst).ToArray();
 string[] ok3 = Enumerable.ToArray((dynamic)olst);
 string[] ok4 = (string[])olst.Clone();

 // ★これらはNG
 // string[] ng1 = (string[])olst.ToArray();
 // string[] ng2 = (string[])Enumerable.ToArray<object>(olst);
 // string[] ng3 = Enumerable.ToArray<string>(olst);
 // string[] ng4 = Enumerable.ToArray<dynamic>(olst);
 // string[] ng5 = Enumerable.ToArray((IEnumerable<dynamic>)olst);
 // string[] ng6 = Enumerable.ToArray<dynamic>((IEnumerable<dynamic>)olst);
 // string[] ng7 = Enumerable.ToArray<dynamic>((dynamic)olst);
 // string[] ng8 = (dynamic)olst.ToArray();



> コピーする方法はあるのでしょうか?
C#2010 以降であれば、下記のようにすることで、
object[] → string[] へのコピーが行えます。

string[] newslst1 = Array.ConvertAll(olst, Convert.ToString);

string[] newslst2 = olst.Cast<string>().ToArray();

string[] newslst3 = new string[olst.GetLength(0)];
olst.CopyTo(newslst3, 0);

https://support.microsoft.com/ja-jp/kb/312390


-------
newslst1 を C#2005/C#2008 環境で利用する場合は、
 string[] newslst1 = Array.ConvertAll<object, string>(olst, Convert.ToString);
に変更してください。

newlst2 は C#2008 でも動作します。
(2005 以下は、そもそも匿名メソッドを使えないため NG ですが)

newslst3 は、2002/2003 を含むすべてのバージョンで動くと思いますが、
こちらでは未検証です。(少なくとも 2005 以降であれば OK です)
引用返信 編集キー/
■76993 / inTopicNo.3)  Re[2]: 配列のコピーについて
□投稿者/ ミーアキャット (13回)-(2015/09/03(Thu) 16:35:47)
No76988 (魔界の仮面弁士 さん) に返信

ありがとうございます。

ところで、
List<int>やList<string>を List<object> とかに変換するにはどうすればよいのでしょうか?

List<int> ilst = new List<int>{1,2,3};
List<object> olst = (Lit<object>)ilst;

とか
List<string> slst = new List<string>{ "a", "b", "c" };
List<object> olst = (Lit<object>)ilst;

のように



引用返信 編集キー/
■76995 / inTopicNo.4)  Re[3]: 配列のコピーについて
□投稿者/ Hongliang (340回)-(2015/09/03(Thu) 16:49:44)
> List<int>やList<string>を List<object> とかに変換するにはどうすればよいのでしょうか?

List<object> olst = ilst.Cast<object>().ToList();
とか。
// object型はできる限り直接は扱わないようにすることをお勧めしますが…。
引用返信 編集キー/
■76996 / inTopicNo.5)  Re[3]: 配列のコピーについて
□投稿者/ shu (773回)-(2015/09/03(Thu) 16:57:47)
No76993 (ミーアキャット さん) に返信

キャストは出来ないのでコピーすることになります。

魔界の仮面弁士さんが提示されているCast<T>を使用して

var ilist = new List<int> { 1, 2, 3 };
List<object> olist = ilist.Cast<object>().ToList();

このようになります。
objectで格納したいなら最初からList<object>で定義した方がよいかと思います。
引用返信 編集キー/
■77006 / inTopicNo.6)  Re[4]: 配列のコピーについて
□投稿者/ ミーアキャット (14回)-(2015/09/04(Fri) 09:19:43)
shu さん 魔界の仮面弁士 さん
どうもありがとうございました。

List<int> と List<string> のデータを
同じように処理したくてそのなかで
変換できなかったので質問させてもらいました。

やりたいことを実行するにはList<object> にするより
やはり、ジェネリックメソッドを使用したほうがよいのでしょうか?
ジェネリックメソッドは少し理解できていないので勉強します。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -