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

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

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

Re[1]: 変換方法について


(過去ログ 131 を表示中)

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

■77289 / inTopicNo.1)  変換方法について
  
□投稿者/ ミーアキャット (29回)-(2015/10/05(Mon) 17:30:12)

分類:[.NET 全般] 

数字文字列を int に変換するには以下のようにしてできるというのは
見つけることができたのですが、
List<int> iList = strList.ConvertAll(x => int.Parse(x));

int を string にする方法が見つかりません。

List<string> iList = strList.ConvertAll(x => x.ToString());
もだめですし
List<string> slst = Value.ConvertAll(x => Convert.ToInt32(x));
こちらもできませんでした。

できないのでしょうか?
new して 順番にループでコピーするのでしょうか?
引用返信 編集キー/
■77291 / inTopicNo.2)  Re[1]: 変換方法について
□投稿者/ Hongliang (349回)-(2015/10/05(Mon) 18:27:42)
「だめでした」ではなく、エラーメッセージをコピー&ペーストで書いてください(ファイルパスなどに現れるユーザ名などは伏せた形で)。
引用返信 編集キー/
■77294 / inTopicNo.3)  Re[1]: 変換方法について
□投稿者/ WebSurfer (667回)-(2015/10/05(Mon) 21:07:00)
No77289 (ミーアキャット さん) に返信

質問に何を作っているか書かない、自分の開発環境を書かないというのは何か理由があるんでしょうかね?
引用返信 編集キー/
■77296 / inTopicNo.4)  Re[2]: 変換方法について
□投稿者/ kaina (6回)-(2015/10/05(Mon) 22:30:40)
老婆心ながら、ちょっと躓いたらネットですぐ質問するようなことは
やめたほうがいいですよ。
そんなことやっててもいつまでたっても成長できないし、
何かミスがあっても気づくことが出来ません。
自分で出来る限り調べて、それでもどうしようもない時だけ聞くようにしましょう。

後、質問するにしても、もう少し質問の仕方を考えましょう。


引用返信 編集キー/
■77298 / inTopicNo.5)  Re[1]: 変換方法について
□投稿者/ ぶなっぷ (54回)-(2015/10/06(Tue) 10:46:17)
2015/10/06(Tue) 10:46:40 編集(投稿者)
では、考えるためのヒントを、

今、使用しているメソッド、
  List.ConvertAll()
ですが、正確な定義は以下の通りです。
(C#くさいので、C#における定義を示す)

public List<TOutput> ConvertAll<TOutput>(
    Converter<T, TOutput> converter
)

ここで、Converterというのはデリゲートです。
デリゲート分かりますか?
語弊があるのを承知で一言で言うならメソッド(関数)を入れる変数です。
分からなかったら勉強してください。

で、Converterデリゲートの定義は以下の通りです。
  public delegate TOutput Converter<in TInput, out TOutput>(
      TInput input
  )

うまく行く方の int.Parse() の定義ですが、
  public static int Parse(
      string s
  )
です。

デリゲートと引数、戻り値が一緒でしょ。
だから呼べるんです。

x.ToString() はデリゲートに一致しない。

Convert.ToInt32(x)はConvert.ToString(x)の間違いかと思われるが、
直せば動くよ。

でもね、この機会だから、みなさんもおっしゃっているとおり、
なぜ動くかを理解することをお勧めします。

引用返信 編集キー/
■77312 / inTopicNo.6)  Re[2]: 変換方法について
□投稿者/ yukihiro (4回)-(2015/10/06(Tue) 23:51:51)
No77298 (ぶなっぷ さん) に返信
> うまく行く方の int.Parse() の定義ですが、
>   public static int Parse(
>       string s
>   )
> です。
> 
> デリゲートと引数、戻り値が一緒でしょ。
> だから呼べるんです。
> 
> x.ToString() はデリゲートに一致しない。

そんなことはないです。
x => x.ToString()
というラムダ式全体がデリゲートになるのであって、
どちらも要求されるデリゲート型を満たしています。

引用返信 編集キー/
■77318 / inTopicNo.7)  Re[1]: 変換方法について
□投稿者/ 魔界の仮面弁士 (519回)-(2015/10/07(Wed) 14:20:52)
No77289 (ミーアキャット さん) に返信
> 数字文字列を int に変換するには以下のようにしてできるというのは
> 見つけることができたのですが、
> List<int> iList = strList.ConvertAll(x => int.Parse(x));

ミーアキャット さんは、上記の『strList』の型が
何であるかを把握されていますか?


変数名が接頭辞 "str" を冠している事から、候補としては
 string / string[] / stream / List<string>
などを連想しますが、ここでは ConvertAll メソッドが使われていることから
私は『strList』を「List<string> 型」であるものと推察しています。



以下、『strList』は 「List<string> 型」であるという前提で回答します。



まず、List<string> とは、複数の string 値を管理する型です。
その ConvertAll メソッドは、各 string 要素を別の型に変換し、
結果を List<変換後の型> で返すメソッドです。

そして今回は、「int.Parse による string → int な変換処理」を
ConvertAll メソッドに指示しています。すなわちこれは、
「List<string> 型の値を List<int> 型に変換している」ことになります。

――ここまでの認識は相違無いでしょうか?



> int を string にする方法が見つかりません。
> List<string> iList = strList.ConvertAll(x => x.ToString());

上記のコードで、「int」を扱っている部分を探してみてください。

まず、 strList は List<string> でしたよね。int では無くて。
そして strList が List<string> なのですから、ConvertAll の x に渡される型は string です。
しかし string 型を ToString() しても、型は string 型のままです。


……どこにも「int」型を取り扱う記述はありません。

すなわち上記は「int → string」ではなく、
「string → string」のためのコードになってしまいます。


これは手順が間違っているとよりも、そもそもの入力値が間違っている事を意味します。

「int を string にする」ことを望んでいるのなら、
List<string> である strList を ConvertAll するのではなく、
List<int> である iList を ConvertAll してみては如何でしょうか。



> List<string> slst = Value.ConvertAll(x => Convert.ToInt32(x));

こちらも考え方は同じです。
そもそも、上記の Value の型が何であるかを、把握できていますか?


Value の型が不明瞭ですが、もしも .ConvertAll が呼べるなら、
Value は恐らく List<何某> 型なのでしょう。
(Value が List<何某> で無い場合は、別の方法で変換することになります)

そして、CoonvertAll で「Convert.ToInt32」での変換処理を渡すという事は、
Value が List<int> なら「int → int 変換」の処理を行うことになりますし、
Value が List<string> なら「string → int 変換」の処理であるわけです。

いずれにせよ、変換した結果は List<int> になるわけですが、それをいきなり
List<string> 型な slst 変数で受ければ、型の不一致を引き起こす道理です。


結果を List<string> で受け取りたいなら、
.ConvertAll に「string 型への変換処理」を指定しましょう。

.ConvertAll に「int 型への変換処理」を指定しているのなら、
結果を List<int> で受け取るようにしましょう。
引用返信 編集キー/
■77319 / inTopicNo.8)  Re[3]: 変換方法について
□投稿者/ ぶなっぷ (55回)-(2015/10/07(Wed) 14:38:16)
2015/10/07(Wed) 14:48:50 編集(投稿者)

yukihiroさん、どうもです。

> x => x.ToString()
> というラムダ式全体がデリゲートになるのであって、
> どちらも要求されるデリゲート型を満たしています。
ですね(^^;)
質問者が動作しないと話していたんで思い込んでいました。

実際に試してみると、
var NumList = new List<int>() { 5, 8, 2, 7, 1, 3, 9 };
List<string> StrList = NumList.ConvertAll(x => x.ToString());
で動作しました。

となると、質問者の何かの勘違いですな。
魔界の仮面弁士さんの意見が当たりくさいです。</pre></pre></pre></pre>
引用返信 編集キー/
■77323 / inTopicNo.9)  Re[4]: 変換方法について
□投稿者/ ぶなっぷ (57回)-(2015/10/07(Wed) 15:37:22)
2015/10/07(Wed) 15:37:38 編集(投稿者)
> 実際に試してみると、
>   var NumList = new List<int>() { 5, 8, 2, 7, 1, 3, 9 };
>   List<string> StrList = NumList.ConvertAll(x => x.ToString());
> で動作しました。

余談ですが、LINQが一般的になってきた昨今、
List<>型にするのが目的でなければ(foreachでぶん回したいだけとか)、
  List<string> StrList = NumList.ConvertAll(x => x.ToString());
より、
  IEnumerable<string> StrList = NumList.Select(x => x.ToString());
  または
  IEnumerable<string> StrList = from Num in NumList select Num.ToString();
の方が一般的かと思います。

なお、LINQでList<>にしたい場合は、
  List<string> StrList = NumList.Select(x => x.ToString()).ToList();
  または
  List<string> StrList =
    (from Num in NumList select Num.ToString()).ToList();
でOK。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -