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

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

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

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

2回答

1878閲覧

参照型引数はワンライナーで処理できない?

nyahonyaho

総合スコア83

C#

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2017/04/11 00:04

編集2017/04/11 00:36
using (FileStream sr= new FileStream( srcName, FileMode.Open, FileAccess.Read)) { //バイト配列"buffer"にdatファイルを読込んでセットします sr.Read(buffer,0,buffer.length); //値がセットされたバイト配列"buffer"にLINQのメソッドチェーンを付加して色々と処理していきます。 buffer.skip(10).~メソッドチェーンが続く }

ソースの最後2行をワンライナーで書く手段てあったりするのでしょうか。
リーダブルコード本に怒られそうな質問内容ですが、なんとなく気になりまして。

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

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

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

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

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

Zuishin

2017/04/11 00:30

C# でも LINQ でもありませんね。タグの見直しをお願いします。おそらく VB.NET だと思います。
Zuishin

2017/04/11 00:32 編集

いえ、すみません。LINQ は合っていました。最終行ですね。でも VB って {} でしたっけ?
guest

回答2

0

ベストアンサー

とりあえず C# で書いてみました。

C#

1using (var fs = new FileStream(@"hoge.dat", FileMode.Open, FileAccess.Read)) 2{ 3 var data = new BinaryReader(fs) 4 .ReadBytes((int)fs.Length) 5 .Skip(10) 6 .ToArray(); 7}

fs.Lengthlong なのに対し、ReadBytes()int なのでキャストしています。ファイルのサイズが int.MaxValue を超えるとうまく動きません。

次のように書いた方が簡単です。

C#

1File.ReadAllBytes("hoge.dat").Skip(10).ToArray();

投稿2017/04/11 00:49

Zuishin

総合スコア28660

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

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

nyahonyaho

2017/04/11 01:02

ネットからコピペが故のVBフェイント、失礼しました
guest

0

LINQのメソッドチェーンで書けないか?ということだと思います。LINQを利用するためにはメソッドチェーン初段がLINQをサポートしているなんらかの型(列的なもの)が前提ですので

FileStream.Read(buffer,0,buffer.length)

戻り値が読み込めたバイト数で副作用が主目的であるReadのようなメソッドでは後段につなげることができません。

他の言語やライブラリーではI/Oもパイプラインとして処理しやすいように、副作用によるインターフェースではなく読み込んだデータそのものをbyteの列、あるいは行単位のstringの列として返すようなインターフェースがよく用いられます。FileStreamはそういうものを備えていませんが、そういう使い方をしたい場合はextensionメソッドを自分で定義しLINQのメソッドチェーンの初段となり得るようにすれば利用できるようになります。

C++

1public static class MyCSharpExtension { 2 // extension method の定義例 3 public static IEnumerable<byte> ReadBytes(this FileStream fs) { 4 byte[] buffer = new byte[4096]; 5 for (;;) { 6 int len = fs.Read(buffer, 0, buffer.Length); 7 if (len == 0) 8 break; 9 for (int i = 0; i < len; i++) 10 yield return buffer[i]; 11 } 12 } 13} 14... 15// 利用例 16using (fs = new FileStream(...)) { 17 fs.ReadBytes().Where(b => b != ' ').Selet( ... ); 18}

投稿2017/04/11 01:19

編集2017/04/11 02:02
KSwordOfHaste

総合スコア18394

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

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

KSwordOfHaste

2017/04/11 01:23

あはは。Zuishinさん回答にあるFile.ReadAllBytesがあるから本件は自分で定義するまでもないですね。 経験少ないとすでにあるメソッドを知らずに自分で書いてしまったりと・・・悲しい空回りをしてしまいがちですw;
Zuishin

2017/04/11 01:34

ReadByte() は遅いのが難点です。多分内部でバッファリングしているはずなんですが。 でも File.ReadAllBytes() は一度全部読み込んでしまうので、メモリ効率の観点からはこの回答の方が上ですね。使い分けられると思います。
KSwordOfHaste

2017/04/11 03:44 編集

なるほどFileStreamはバッファリングしてくれてないのですね。せめて自分の例はReadを使ってバッファーへ読み込むようなものにすべきということでしょうね。コメントありがとうございました。 --- Zuishinさんコメントを参考に例をバッファリングするようなものに変えておきました。File.ReadAllBytesがあるのでどうでもよいことではありますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問