トップページ⇒tech
1001コメント310KB

ふらっとC#,C♯,C#(初心者用) Part67

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2010/12/16(木) 18:23:33
このスレッドは
「どんなにくだらないC#プログラミングに関する発言でも誰かが優しくレスをしてくれるスレッド」です。
ほかのスレッドでは恐ろしくて書き込めないような低レベル、もしくは質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からない場合など、勇気をもって書き込んでください。
内容に応じて、他スレ・他板へ行くことを勧められる、あるいは誘導される場合がありますがご了承下さい。

なお、テンプレ2行目が読めない回答者は邪魔なので後述のC#相談室に移動して下さい。

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっとC#,C♯,C#(初心者用) Part66
http://hibari.2ch.net/test/read.cgi/tech/1290854247/

■関連スレ
C#, C♯, C#相談室 Part63
http://hibari.2ch.net/test/read.cgi/tech/1289733048/
VB.NET質問スレ(Part35)
http://hibari.2ch.net/test/read.cgi/tech/1284423653/
くだすれC++/CLI(初心者用)part2
http://pc12.2ch.net/test/read.cgi/tech/1268613679/

■備考
コードの量が多い場合は下記サイトを使うなどしたほうがいいかも
http://ideone.com/
コードを貼り付けてRun codeのチェックをはずしてsubmitボタンを押すと
コードを鯖側にアップして専用のアドレスが発行されます。

直接貼る場合は下記サイトなどを利用してhtmlエンコードした方が
インデントも残って見やすいです
http://kawama.jp/php/encode_html.php
0002デフォルトの名無しさん2010/12/16(木) 18:27:19
1>>乙
0003デフォルトの名無しさん2010/12/16(木) 19:10:57

「乙」とは十干(じっかん、甲乙丙丁戊己庚辛壬癸)の第2番目。「きのと」とも読む。五行は木、陰陽は陰。草花を象徴し、協調・社交・和合を意味する。

または甲で始まる順位の第2位。「乙種」「甲乙つけがたい」

乙>>1
0004デフォルトの名無しさん2010/12/17(金) 10:37:49
>1お疲れさまです^^

早速質問なんですが、xmlデータの取込の際にタグで
<ns0:root xmlns:ns0="http:〜">のタグって名前空間とまで分かったのですが

public T Deserialize<T>(string fileName, string encode = "Shift_JIS")
{
var serializer = new XmlSerializer(typeof(T));
using (var tr = new StreamReader(fileName, Encoding.GetEncoding(encode)))
{
return (T)serializer.Deserialize(tr);
}
}
の形で取り込む時に<T>のクラス指定での名前空間の指定(?)の方法がわかりません;w;
どなたか分かる方いらっしゃいますか?

説明下手ですいません。。。
0005デフォルトの名無しさん2010/12/17(金) 10:44:13
DOMを使うべき
000642010/12/17(金) 10:55:26
業者から来る形がいままで名前空間の無いXMLが来ていたのですが
新規の業者に名前空間が付いていることと、既存の取込方法をしようして
取り込みたいのでどうぞよろしくおねがいいたします。
0007デフォルトの名無しさん2010/12/17(金) 11:21:39
DOMで好きなように書き換えてからXmlSerializerに食わせればいいじゃん
0008デフォルトの名無しさん2010/12/17(金) 11:26:22
xmlは詳しくないけどxmlの中に名前空間を持ったノード?が存在できて
そのクラスが独自に存在するならそういうデータを作ってそのクラスの型を調べればいいんじゃね?
0009デフォルトの名無しさん2010/12/17(金) 11:30:19
だいたいDOMを使わなかった元の設計者が糞
0010デフォルトの名無しさん2010/12/17(金) 11:33:46
うーむ、、、独自にXPathDocument使ってしまおうかな@w@

それなら簡単だし。。。
0011デフォルトの名無しさん2010/12/17(金) 11:35:45
>>10
昔のようにメモリかつかつな時代でもないんだし
従来のロジック+新しいロジックの併用運用すればいいじゃん
新しい方でもいけるならそっちに切り替えるとかすればいいんだし
0012デフォルトの名無しさん2010/12/17(金) 11:51:31
そうですね、、、そうします@w@んでこっそりいままのやつも変更・・しようかなぁ
0013デフォルトの名無しさん2010/12/17(金) 14:33:27
スキーマがあるならxsd.exeでクラス自動生成させて
XmlSerializerに食わせれば一発だよ
0014デフォルトの名無しさん2010/12/17(金) 15:28:24
streamreader で何行か読んで、
今のストリームの位置を変数かなんかに
保存してbinaryreader でそこから読んでいきたいんですが
可能ですか?素直にbinaryreader で一文字ずつ読んで
改行文字を追うべきでしょうか
0015デフォルトの名無しさん2010/12/17(金) 15:30:25
そんな読み方して何やるの?
0016デフォルトの名無しさん2010/12/17(金) 15:48:05
途中までテキストとして扱えるファイルを使うのに
便利そうなので・・・
0017デフォルトの名無しさん2010/12/17(金) 16:11:07
>>16
StreamReaderはある程度の量をバッファーに読み込みながら処理しているんだけど、
そのバッファーをどこまで使ったかはプライベートになっているので外部からではわからない。
文字列の長さから位置を割り出そうとしても、改行文字が\nか\r\nかわからないし、
エンコーディングの関係でずれる可能性があるので難しい。
リフレクション使えばなんとかなるかもしれないけど、
素直にbinaryreaderで一文字ずつ読んで改行文字を追っていったほうが楽そう。
0018デフォルトの名無しさん2010/12/17(金) 16:14:14
>>17
というかテキストとバイナリの境目って何で判断するのって話だな
テキストデータってのはバイナリコードをあるルールに従って扱ってるだけの話だし

作ってる人間はここまでがテキストここからはバイナリと思ってても
コードだけみたんじゃあわからないぞ
0019デフォルトの名無しさん2010/12/17(金) 16:15:33
あー、ちょっと訂正
streamreader.CurrentEncoding.GetByteCount使えば文字列の長さは割り出せるね
0020デフォルトの名無しさん2010/12/17(金) 16:28:38
割り出せないよ
だいたいそれ使うならオンメモリだからストリーム戻す必要なんかない
最初から別のbyte配列に読んでしまえばいいだけのこと
0021デフォルトの名無しさん2010/12/17(金) 16:29:37
>>18
テキストとしてみたとき
4行だけ読めば良い、とか特定の文字の出現ででテキストとして解釈できる
範囲が確定できる場合を想定してるんです
0022デフォルトの名無しさん2010/12/17(金) 16:53:12
ちょっと大げさかもしれんが
class BinaryReaderEx : BinaryReader {
  public BinaryReaderEx(Stream input) : base(input) {
  }
  public string ReadLine() {
    StringBuilder sb = new StringBuilder();
    char c;
    while ((c = this.ReadChar()) != '\n') {
      if (c == '\r') continue;
        sb.Append(c);
      }
      return sb.ToString();
      }
    }
  }
}
0023デフォルトの名無しさん2010/12/17(金) 18:38:53
C#の文法やら仕様について詳しい他言語経験者向けの書籍でオススメなの有りますか?
0024デフォルトの名無しさん2010/12/17(金) 18:44:15
>>23
どの言語から来たかしらないがクラスを覚える必要があるけど
基本はそんなに難しくないと思うのでここでも一読を
http://ufcpp.net/study/csharp/index.html

まあどの言語から来るかにもよるんですけどね・・・・
0025デフォルトの名無しさん2010/12/17(金) 18:45:44
>クラスを覚える必要があるけど
MSが用意したクラスを覚える必要があるけど
0026デフォルトの名無しさん2010/12/17(金) 18:50:11
>>23
標準講座C#
978-4798114736

なんかどう?
0027デフォルトの名無しさん2010/12/17(金) 18:56:31
Cを中心にC++をちょっとかじった程度です

>>24>>26
なかなか分かりやすそうでよさげですね
そこそこ良いお値段するけど中身も良さそうなのでちょっと書店で目を通してみます
0028142010/12/17(金) 21:16:11
GetByteCount と BaseStream.Seek

で出来ました。一箇所妙な出力が残ってますが

>>19
どうも
0029デフォルトの名無しさん2010/12/17(金) 22:59:02
それ、出来たっていうのだろうか
0030デフォルトの名無しさん2010/12/17(金) 23:09:28
>>29
明らかに消せそうだったので
もう直せましたし
0031デフォルトの名無しさん2010/12/17(金) 23:17:04
文字列として読み取ったブロックの元の長さと、GetByteCount(読み取られた文字列)が等しいことは
保障されるの?
0032デフォルトの名無しさん2010/12/18(土) 00:38:15
助けて下さい。
GoogleのAPIでGoogleカレンダーをc#で表示するにはどうしたらいいんでしょうか。SDKはDL済み、環境はVS2008です
いろいろいじってみたのですが全くわかりませんでした。
0033デフォルトの名無しさん2010/12/18(土) 06:45:52
こういうのはアリ?

Bitmap bmp = (略
pictureBox1.Image = bmp;


それともこうしなきゃだめ?

Bitmap bmp = (略
Image old = pictureBox1.Image;
pictureBox1.Image = bmp;
old.Dispose();
0034デフォルトの名無しさん2010/12/18(土) 08:21:01
>>32
web系のAPIってぶっちゃけると単なるURLでしょ


>>33
なんのためのGCかと
0035デフォルトの名無しさん2010/12/18(土) 09:02:27
>>33
なんか懐かしいw
DCにブラシやペンを設定〜
0036デフォルトの名無しさん2010/12/18(土) 09:12:57
>>35
c#でもブラシやペン使うときはDisposeするよ
http://dobon.net/vb/dotnet/graphics/fillrectangel.html
Dispose書き忘れが嫌ならusingで囲っちゃえばいいだけだし

PictureBoxに渡してあったImageは新しいImageを渡すことで
切り離されていずれGCが開放するだろうけど
0037デフォルトの名無しさん2010/12/18(土) 10:33:36
>>33
同じ処理したことあるけど、考えたことなかった。
確かに Dispose() したくなるね。
pictureBox.Image の set 時に、 勝手にDispose()してくれるとうれしいけど、どうだろう。

以下のサンプルではDispose()してないから、不要かな。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.picturebox.image%28v=VS.80%29.aspx
0038デフォルトの名無しさん2010/12/18(土) 10:46:49
>>37
勝手にDisposeされたら怖いわ
二つのImageを状況に応じて切り替えとかできねぇじゃん

たまに替えるだけなら基本はGCまかせでOK
ビューアとかならちゃんと以前のはDispose
0039332010/12/18(土) 15:03:24
やっぱそうかーありがとう
それなりにぱかぱかBitmap生成して切り替えるからDispose必要ですね(精神衛生上)
コードが冗長になって凹むけど一応書いておこう
0040デフォルトの名無しさん2010/12/18(土) 15:10:15
精神衛生上じゃないよ
Imageが占有するメモリはGCが関知しないから解放がすごく遅れる可能性が高い
0041デフォルトの名無しさん2010/12/18(土) 15:23:19
c#初心者です.DataTable教えてください
MSDNサンプルを実行してみたのですが,
ttp://msdn.microsoft.com/ja-jp/library/9ha04z01.aspx

table.Columns.Add(column);
でAddしたcolumnはどこに格納されるのでしょうか?
table.Columnsの中身を探しても見つかりません.
0042デフォルトの名無しさん2010/12/18(土) 15:43:29
>>41
table.Columns.Count は増えてる?
0043デフォルトの名無しさん2010/12/18(土) 15:50:04
増えてます
foreach (DataColumn dc in table.Columns)
  MessageBox.Show(dc.ColumnName);
とすると中身も表示されます.
ただ,デバッグ画面のローカルって所を探してもAddした情報がないので,
どこに格納されているのかなと思いまして.
0044デフォルトの名無しさん2010/12/18(土) 16:01:02
>>43
格納されているのは、認識通りでいいよ。
ちゃんと探せば出てくる。表示名がインターフェースに変わって、見つけづらいのかも。
0045デフォルトの名無しさん2010/12/18(土) 16:55:49
>>33
Bitmap bmp = (略
pictureBox1.Image.Dispose();;
pictureBox1.Image = bmp;

じゃだめなん?
PictureBox使ったことないからよくわからんけど
0046デフォルトの名無しさん2010/12/18(土) 17:08:32
>>45
ゆっくりやるとダメ。早くやれば問題がでづらいかも。
少し気持ち悪い。
0047332010/12/18(土) 19:22:11
>>46
まとめるとこう?
oldで挟むよりは気持ちいい

Bitmap bmp = (略
using(Image old = pictureBox1.Image){
  pictureBox1.Image = bmp;
}

Bitmapクラスの内部がどうなってるか知らないけど
BITMAPハンドル保持してるとかだったら
自前でDisposeしないと危ないね
0048432010/12/18(土) 19:25:07
>>44
_primaryIndexっていうパブリックでないメンバーにはいってました.
0049デフォルトの名無しさん2010/12/18(土) 20:41:52
VC#で作たWindowsアプリを、ASP.NET使ってIEで操作できるようにしたいんだけど
なんでPictureBox使えなくなるの?
HTML使った事ないから、まとな画像処理できねぇよwww
0050デフォルトの名無しさん2010/12/18(土) 20:43:01
Silverlight使えば?
たいがいなんでもできるよ
0051デフォルトの名無しさん2010/12/18(土) 21:02:16
>>49
画像処理するだけならPictureBoxはいらないでしょ。
0052デフォルトの名無しさん2010/12/18(土) 21:05:28
ASP.NETって何かわかってるんだろうか
ブラウザはサーバーが生成したHTMLをただ表示してるだけで
C#のコードは全部サーバー側で動作するんだよ? Windowsアプリとは全く違うんだけど理解してる?
ブラウザ側でC#動かして画像処理とかやりたいならSilverlightでも使わないと
■ このスレッドは過去ログ倉庫に格納されています