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

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

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

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

Q&A

解決済

2回答

3267閲覧

FileInfoでLinqを使ってデータを取得

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2018/07/21 16:02

編集2018/07/22 15:25

前提・実現したいこと

取得したFileInfoのリストについて次の2つを実装したいのですが、
1つはエラーになり、もう1つは書き方がわかりません。
ご教示お願いします。

・ファイル名の長いパスの上位3つを取得。
(こちらコードに書きましたがエラーになります)

・リストの中のファイルサイズの合計を取得。
(こちらはコードが思いつきませんでした。) 

該当のソースコード

C#

1 private void Form1_Load(object sender, EventArgs e) 2 { 3 List<FileInfo> filelist = new List<FileInfo>(); 4 DirectoryInfo di = new DirectoryInfo(@"C:\Users\username\Desktop\testfolder"); 5 6 foreach (FileInfo fi in di.GetFiles()) 7 { 8 filelist.Add(fi); 9 } 10 //ここでエラー。 11 List<FileInfo>longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3); 12 13 //fileの中のファイルサイズの合計取得はLinqでどのように書けばよいですか? 14 //ファイルサイズはfi.Lengthのように、Lengthで取得可能のようです。 15 16 }

追記

エラーメッセージ(間違えてたので書き直しました。)

エラーCS0266型'System.Collections.Generic.IEnumerable<System.IO.FileInfo>' を 'System.Collections.Generic.List<System.IO.FileInfo>' に暗黙的に変換できません。 明示的な変換が存在します (キャストが不足していないかどうかを確認してください)

下記で解消されました。

IEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3);

環境

Windows 10, Visual Studio 2017,

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/07/21 22:33 編集

自分の開発環境(OS, .NET, Visual Studio のバージョンなど) も書くようにしましょう。
退会済みユーザー

退会済みユーザー

2018/07/21 22:32 編集

エラーが出ているなら、エラーメッセージをコピペして書くようにしましょう。
退会済みユーザー

退会済みユーザー

2018/07/22 02:02

ご指摘ありがとうございます。エラーメッセージに気づきませんでした。エラーメッセージから修正できました。
退会済みユーザー

退会済みユーザー

2018/07/22 02:23

質問に追記していていただいたエラーメッセージは間違ってませんか? 「'System.Collections.Generic.IEnumerable<System.IO.FileInfo>' を 'System.Collections.Generic.List<System.IO.FileInfo>' に暗黙的に変換できません。」になるはず。解決策としては右辺に ToList() を付与すれば良いはずです。
guest

回答2

0

ベストアンサー

上のコメントにも書きましたが、「ファイル名の長いパスの上位3つを取得」のエラーは ToList() を付与して解決、「リストの中のファイルサイズの合計を取得」は YAmaGNZ さんのレスにある通り Sum を使うことで取得できるはずです。

List<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).ToList(); long sizeTotal = filelist.Sum(s => s.Length);

投稿2018/07/22 02:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/22 15:57

ご回答ありがとうございます。 質問に追記したエラーメッセージが間違っていましたので修正しました。 ご教示ありがとうございます。 Sumの具体的なコードを明示していただけたのでベストアンサーに選ばせていただきました。 ありがとうございました。
guest

0

合計はSumを使えばいいかと

エラーに関してですが、とりあえず長いパスを作成してテストしたところ
266文字のフルパス名が存在してもエラーにはなりませんでした。
ただ、Windowsのパス名の最大が260文字らしく、これ以上となるとエクスプローラーでの操作も怪しい状態になったので試せませんでしたが、エラーは発生しませんでした。

投稿2018/07/21 23:05

YAmaGNZ

総合スコア10222

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

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

退会済みユーザー

退会済みユーザー

2018/07/22 02:08 編集

ご回答ありがとうございます。 追記しました。 とりあえず、フォルダはパス名の短いもので試しています。 また、エラーメッセージに気づかず、掲載してませんでした、すみません。 エラーメッセージより、修正できました。 しかし、エラーメッセージの通り修正したら、IEnumerable型で受け取る書き方になってしまったのですが、Linqというのは、戻り値はIEnumerable型になってしまうということですか? (List型では受け取れないということですか?List型のメソッド(?)でOrderByDescendingを呼び出しているのに、受け取りはList型でできないというのが、不思議な感じがしました。) ご提示いただいたSumのページを見ながら、合計の方も考えてみます。
YAmaGNZ

2018/07/22 02:30

List<T>にしたいなら List<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).ToList<FileInfo>(); とすればよいかと
退会済みユーザー

退会済みユーザー

2018/07/22 15:53

ご回答ありがとうございます。 勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問