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

回答編集履歴

11

文章構成の訂正その2

2015/09/08 02:38

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -8,7 +8,9 @@
8
8
  int max = z.Where(item => item["NO1"] == "AAA").Max(item => int.Parse(item["NUM"]));
9
9
  ```
10
10
 
11
- Dictionary型の要素自体を取り出したい場合は以下のようにすれば良いでしょう
11
+ Dictionary型の要素自体を取り出したい場合は少し変則的なります。
12
+ NUMが最大値の要素を取得するには`OrderByDescending`メソッドを使います。
13
+ シーケンスをソートして先頭の要素を取ってくることで最大値を含む要素を検索します。
12
14
  ```C#
13
15
  var values = new[] {
14
16
  new {No1="AAA", No2="DDD", NUM=500},
@@ -30,9 +32,6 @@
30
32
  Console.WriteLine(value.No2); // => EEE
31
33
  ```
32
34
 
33
- NUMが最大値の要素を取得するには`OrderByDescending`メソッドを使います。
34
- シーケンスをソートして先頭の要素を取ってくることで最大値を含む要素を検索します。
35
-
36
35
  最大値を含む要素をNo1の値毎に取得したい場合には`GroupBy`メソッドを使うと良いでしょう。
37
36
  ```C#
38
37
  var values = new[] {

10

文章校正の訂正その2

2015/09/08 02:38

投稿

haru666
haru666

スコア1593

answer CHANGED
File without changes

9

文章校正の訂正

2015/09/08 02:37

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,9 @@
1
1
  ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
3
  値のみを取得する場合にはozwkさんが前述されているように`Max`メソッドを使用しましょう。
4
+ まず、`Where`メソッドでNo1がAAAの要素に絞り込みます。
5
+ 次に、`Max`メソッドで何の値の最大値を取得するかをデリゲートで指定します。
6
+
4
7
  ```C#
5
8
  int max = z.Where(item => item["NO1"] == "AAA").Max(item => int.Parse(item["NUM"]));
6
9
  ```
@@ -27,8 +30,7 @@
27
30
  Console.WriteLine(value.No2); // => EEE
28
31
  ```
29
32
 
30
- まず、`Where`メソッドでNo1がAAAの要素に絞り込みます。
31
- NUMが最大値の要素を取得するには`OrderByDescending`メソッドを使えばよでしょう
33
+ NUMが最大値の要素を取得するには`OrderByDescending`メソッドを使います
32
34
  シーケンスをソートして先頭の要素を取ってくることで最大値を含む要素を検索します。
33
35
 
34
36
  最大値を含む要素をNo1の値毎に取得したい場合には`GroupBy`メソッドを使うと良いでしょう。

8

表現を訂正

2015/09/08 02:36

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
- だけで十分であればozwkさんが前述されているように`Max`メソッドを使用しましょう。
3
+ のみを取得する場合にはozwkさんが前述されているように`Max`メソッドを使用しましょう。
4
4
  ```C#
5
5
  int max = z.Where(item => item["NO1"] == "AAA").Max(item => int.Parse(item["NUM"]));
6
6
  ```

7

ozwkさんの説明に対する追記

2015/09/08 02:34

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,10 @@
1
1
  ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
3
  値だけで十分であればozwkさんが前述されているように`Max`メソッドを使用しましょう。
4
+ ```C#
5
+ int max = z.Where(item => item["NO1"] == "AAA").Max(item => int.Parse(item["NUM"]));
6
+ ```
7
+
4
8
  Dictionary型の要素自体を取り出したい場合は以下のようにすれば良いでしょう。
5
9
  ```C#
6
10
  var values = new[] {

6

訂正

2015/09/08 02:33

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
- 値だけで十分であればozwkさんが前述されているように`Max`メソッドを使用するだけで十分です
3
+ 値だけで十分であればozwkさんが前述されているように`Max`メソッドを使用しましょう
4
4
  Dictionary型の要素自体を取り出したい場合は以下のようにすれば良いでしょう。
5
5
  ```C#
6
6
  var values = new[] {

5

追記

2015/09/08 02:29

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
+ 値だけで十分であればozwkさんが前述されているように`Max`メソッドを使用するだけで十分です。
3
- No1値毎に1回ずつLinq実行する場合は以下のようにすれば良いでしょう。
4
+ Dictionary型要素自体取り出したい場合は以下のようにすれば良いでしょう。
4
5
  ```C#
5
6
  var values = new[] {
6
7
  new {No1="AAA", No2="DDD", NUM=500},

4

Dictionary型にあわせてコメントを追加

2015/09/08 02:29

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -14,6 +14,11 @@
14
14
  .OrderByDescending(x => x.NUM)
15
15
  .FirstOrDefault();
16
16
 
17
+ // Dictionary型の場合以下のようになります
18
+ // values.Where(x => x["NO1"] == "AAA")
19
+ // .OrderByDescending(x => int.Parse(x["NUM"]))
20
+ // .FirstOrDefault();
21
+
17
22
  Console.WriteLine(value.No2); // => EEE
18
23
  ```
19
24
 

3

追記の改善

2015/09/08 02:22

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,4 +1,4 @@
1
- ※まず第一に、List<Dictionary<string, T>>の形式を止めた方が良いとは思いますが
1
+ ※まず第一に、List<Dictionary<string, string>>の形式を止めた方が良いとは思いますが…時間があればクラスにしましょう
2
2
 
3
3
  No1の値毎に1回ずつLinqを実行する場合は以下のようにすれば良いでしょう。
4
4
  ```C#

2

最初の1文を追記

2015/09/08 02:19

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ※まず第一に、List<Dictionary<string, T>>の形式を止めた方が良いとは思いますが
2
+
1
3
  No1の値毎に1回ずつLinqを実行する場合は以下のようにすれば良いでしょう。
2
4
  ```C#
3
5
  var values = new[] {

1

語彙の変更

2015/09/08 02:18

投稿

haru666
haru666

スコア1593

answer CHANGED
@@ -7,7 +7,7 @@
7
7
  new {No1="BBB", No2="GGG", NUM=200},
8
8
  };
9
9
 
10
- // No1を"AAA"で絞り込み、NUMを降順に並べ替えてからその先頭の1つを得る
10
+ // No1を"AAA"で絞り込み、NUMを降順に並べ替えてからその先頭の要素1つを得る
11
11
  var value = values.Where(x => x.No1 == "AAA")
12
12
  .OrderByDescending(x => x.NUM)
13
13
  .FirstOrDefault();
@@ -15,11 +15,11 @@
15
15
  Console.WriteLine(value.No2); // => EEE
16
16
  ```
17
17
 
18
- まず、`Where`メソッドでNo1がAAAの値だけのものに絞り込みます。
18
+ まず、`Where`メソッドでNo1がAAAの要素に絞り込みます。
19
- NUMが最大値のを取得するには`OrderByDescending`メソッドを使えばよいでしょう。
19
+ NUMが最大値の要素を取得するには`OrderByDescending`メソッドを使えばよいでしょう。
20
- をソートして先頭のを取ってくることで最大値を含むを検索します。
20
+ シーケンスをソートして先頭の要素を取ってくることで最大値を含む要素を検索します。
21
21
 
22
- 上記のようにNo1の値1つに対してではなく、最大値を含むを値毎に取得したい場合には`GroupBy`メソッドを使うと良いでしょう。
22
+ 最大値を含む要素No1の値毎に取得したい場合には`GroupBy`メソッドを使うと良いでしょう。
23
23
  ```C#
24
24
  var values = new[] {
25
25
  new {No1="AAA", No2="DDD", NUM=500},
@@ -35,9 +35,9 @@
35
35
 
36
36
  // 1. GroupByを使ってNo1の値毎に個別のシーケンスに変換します
37
37
  // 2. シーケンスをNUMの値で降順に並べ替えます
38
- var result = values.GroupBy(value => value.No1)
38
+ var result = values.GroupBy(x => x.No1)
39
- .Select(grouped =>
39
+ .Select(g =>
40
- grouped.OrderByDescending(value => value.NUM)
40
+ g.OrderByDescending(x => x.NUM)
41
41
  .First());
42
42
 
43
43
  foreach (var value in result)
@@ -52,8 +52,9 @@
52
52
  ```
53
53
 
54
54
  ---
55
+
55
56
  蛇足ですが、パフォーマンスを考えるとDBのSELECT文を変える方が良いこともあります。
56
-
57
+ より良いものを選択してください。
57
58
  ```SQL
58
59
  SELECT * FROM db a
59
60
  WHERE a.num = (SELECT MAX(num) FROM DB b WHERE a.NO1=b.NO1)