回答編集履歴

2

エラー対応

2018/07/24 01:50

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -105,3 +105,45 @@
105
105
  }
106
106
 
107
107
  ```
108
+
109
+
110
+
111
+ --- 追記
112
+
113
+ コンパルエラーについて、エラー文のところだけ書きますが、次のいずれかで解決できます。
114
+
115
+ ```csharp
116
+
117
+ //下記でエラーになります。長いパス名ベスト3を取得したいです。
118
+
119
+ IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3);
120
+
121
+ // (1)IEnumerableにする
122
+
123
+ //IEnumerable<string> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).Select(s => s.FullName); //パターンA 文字列にSelectする
124
+
125
+ //IEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3); //パターンB FileInfoを型で受けとる
126
+
127
+ // (2)IOrderedEnumerableのままにする
128
+
129
+ //IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length); //パターンC、Takeしない
130
+
131
+ //IOrderedEnumerable<FileInfo> longlist = filelist.OrderByDescending(s => s.FullName.Length).Take(3).OrderByDescending(s=>s.FullName.Length); //パターンD再度ソートする
132
+
133
+ ```
134
+
135
+ 大きな区分けとして、IEnumerableでいくのか、IOrderedEnumerableでいくのかを決めてください。
136
+
137
+ Aですが、filelistはFileInfo型なのに、左辺は<string>になっていることを、selectで解決しています。
138
+
139
+ Bについては、Aと異なり、generic型のほうを変えています。
140
+
141
+ Cでは、Orderedにすることを考えると、Takeが余計なので、単純に取りました。またgeneric型もFileInfoにしています。
142
+
143
+ Dは、遠回りですが、再度ソートすれば、takeして、OrderedEnumerableにすることができます。
144
+
145
+
146
+
147
+ stackoverflowexceptionについては、考えてみます。
148
+
149
+ elementatをしないとエラーにならないのは、Linqが遅延評価だからです、実際に値が必要になるまで演算が延期されているせいです。

1

エラー対応

2018/07/24 01:50

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -31,3 +31,77 @@
31
31
 
32
32
 
33
33
  ただ、サイズを測定するという関数が、その副作用として、ファイル名の長いものをリストアップするなんてことをなぜしたいかがまったく分からないです。
34
+
35
+
36
+
37
+ -- 追記(stackoverflow)
38
+
39
+ コンソールアプリで、下記を実行しましたがエラーになりませんでした。コードの確認をお願いします。また再現しなかったので、エラーのstacktraceとか他の情報をいただかないと分からないです。
40
+
41
+ (E:\somewhereはファイル数4800以上フォルダ数1200以上サイズ213MBです)
42
+
43
+ ```csharp
44
+
45
+ static void Main(string[] args)
46
+
47
+ {
48
+
49
+ long dirsize = GetDirectorySize(new DirectoryInfo(@"E:\somewhere"));
50
+
51
+ Console.WriteLine(longfile.ElementAt(0));
52
+
53
+ Console.WriteLine(longfile.ElementAt(1));
54
+
55
+ Console.WriteLine(longfile.ElementAt(2));
56
+
57
+ }
58
+
59
+ static IEnumerable<string> longfile = Enumerable.Repeat("", 3);
60
+
61
+
62
+
63
+ public static long GetDirectorySize(DirectoryInfo dirInfo)
64
+
65
+ {
66
+
67
+ long size = 0;
68
+
69
+
70
+
71
+ //フォルダ内の全ファイルの合計サイズを計算する。
72
+
73
+ foreach (FileInfo fi in dirInfo.GetFiles())
74
+
75
+ {
76
+
77
+ size += fi.Length;
78
+
79
+
80
+
81
+ longfile = longfile.Concat(new[] { fi.FullName }).OrderByDescending(s => s.Length).Take(3);
82
+
83
+ }
84
+
85
+
86
+
87
+ //サブフォルダのサイズを合計していく。
88
+
89
+ foreach (DirectoryInfo di in dirInfo.GetDirectories())
90
+
91
+ {
92
+
93
+ size += GetDirectorySize(di);
94
+
95
+
96
+
97
+ }
98
+
99
+
100
+
101
+ //結果を返す
102
+
103
+ return size;
104
+
105
+ }
106
+
107
+ ```