teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

エラー対応

2018/07/24 01:50

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -51,4 +51,25 @@
51
51
  //結果を返す
52
52
  return size;
53
53
  }
54
- ```
54
+ ```
55
+
56
+ --- 追記
57
+ コンパルエラーについて、エラー文のところだけ書きますが、次のいずれかで解決できます。
58
+ ```csharp
59
+ //下記でエラーになります。長いパス名ベスト3を取得したいです。
60
+ IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3);
61
+ // (1)IEnumerableにする
62
+ //IEnumerable<string> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).Select(s => s.FullName); //パターンA 文字列にSelectする
63
+ //IEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3); //パターンB FileInfoを型で受けとる
64
+ // (2)IOrderedEnumerableのままにする
65
+ //IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length); //パターンC、Takeしない
66
+ //IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).OrderByDescending(s=>s.FullName.Length); //パターンD再度ソートする
67
+ ```
68
+ 大きな区分けとして、IEnumerableでいくのか、IOrderedEnumerableでいくのかを決めてください。
69
+ Aですが、filelistはFileInfo型なのに、左辺は<string>になっていることを、selectで解決しています。
70
+ Bについては、Aと異なり、generic型のほうを変えています。
71
+ Cでは、Orderedにすることを考えると、Takeが余計なので、単純に取りました。またgeneric型もFileInfoにしています。
72
+ Dは、遠回りですが、再度ソートすれば、takeして、OrderedEnumerableにすることができます。
73
+
74
+ stackoverflowexceptionについては、考えてみます。
75
+ elementatをしないとエラーにならないのは、Linqが遅延評価だからです、実際に値が必要になるまで演算が延期されているせいです。

1

エラー対応

2018/07/24 01:50

投稿

papinianus
papinianus

スコア12705

answer CHANGED
@@ -14,4 +14,41 @@
14
14
  longfile = longfile.Concat(new []{fi.FullName}).OrderByDescending(s=>s.Length).Take(3);
15
15
  ```
16
16
 
17
- ただ、サイズを測定するという関数が、その副作用として、ファイル名の長いものをリストアップするなんてことをなぜしたいかがまったく分からないです。
17
+ ただ、サイズを測定するという関数が、その副作用として、ファイル名の長いものをリストアップするなんてことをなぜしたいかがまったく分からないです。
18
+
19
+ -- 追記(stackoverflow)
20
+ コンソールアプリで、下記を実行しましたがエラーになりませんでした。コードの確認をお願いします。また再現しなかったので、エラーのstacktraceとか他の情報をいただかないと分からないです。
21
+ (E:\somewhereはファイル数4800以上フォルダ数1200以上サイズ213MBです)
22
+ ```csharp
23
+ static void Main(string[] args)
24
+ {
25
+ long dirsize = GetDirectorySize(new DirectoryInfo(@"E:\somewhere"));
26
+ Console.WriteLine(longfile.ElementAt(0));
27
+ Console.WriteLine(longfile.ElementAt(1));
28
+ Console.WriteLine(longfile.ElementAt(2));
29
+ }
30
+ static IEnumerable<string> longfile = Enumerable.Repeat("", 3);
31
+
32
+ public static long GetDirectorySize(DirectoryInfo dirInfo)
33
+ {
34
+ long size = 0;
35
+
36
+ //フォルダ内の全ファイルの合計サイズを計算する。
37
+ foreach (FileInfo fi in dirInfo.GetFiles())
38
+ {
39
+ size += fi.Length;
40
+
41
+ longfile = longfile.Concat(new[] { fi.FullName }).OrderByDescending(s => s.Length).Take(3);
42
+ }
43
+
44
+ //サブフォルダのサイズを合計していく。
45
+ foreach (DirectoryInfo di in dirInfo.GetDirectories())
46
+ {
47
+ size += GetDirectorySize(di);
48
+
49
+ }
50
+
51
+ //結果を返す
52
+ return size;
53
+ }
54
+ ```