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

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

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

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

LINQ

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

Q&A

解決済

2回答

41784閲覧

LINQで最大値ではなく、最大値を持つ要素の取得とforeach。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

LINQ

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

0グッド

2クリップ

投稿2018/07/23 05:29

前提・実現したいこと

LINQの勉強をしています。
LINQで最大値ではなく、最大値を持つ要素を取得したいです。
いくつか方法はあると思いますが、Max()を使うのがおそらく1番シンプルに書けると思うのですが、
その書き方のご教示をお願いします。

また、該当のソースコードのforeach文をLINQで書き換えることは可能ですか?
こちらのご教示もお願いします。

該当のソースコード

ファイルサイズの最大値をもつFileInfoの要素を取得したいです。
ファイルサイズの最大値そのものは取得できました。

C#

1  List<FileInfo> filelist = new List<FileInfo>(); 2 DirectoryInfo di = new DirectoryInfo(@"C:\Users\username\Desktop\testfolder"); 3 4 foreach (FileInfo fi in di.GetFiles()) 5 { 6 filelist.Add(fi); 7 } 8 9 //リストの中で最大値のファイルサイズを取得する。 10 long maxsize = filelist.Max(s => s.Length); 11 Console.WriteLine(maxsize); 12 13 //リストの中で最大値のファイルサイズを持つ要素を取得するにはどうすればいいですか? 14 //Maxを使って取得することはできますか?

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

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

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

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

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

guest

回答2

0

質問者さんが先のスレッドで使っていた OrderByDescending を使ってできると思います。

以下のような感じ。

FileInfo max = filelist.OrderByDescending(s => s.Length).FirstOrDefault();

もっとスマートな方法はあるかもしれませんが。

投稿2018/07/23 07:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/07/23 09:41 編集

ご回答ありがとうございます。 勉強になりました。 Maxを使って簡単にできるかと思っていたのですが、そのような方法はなさそうなんですね。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/07/23 11:43

Max を使うと、かなり無理やりっぽいですが、以下のような感じでしょうか。これももっとスマートな方法はあるかもしれませんが。 FileInfo max = filelist.Find(s => s.Length == filelist.Max(p => p.Length));
退会済みユーザー

退会済みユーザー

2018/07/23 15:53

ご回答ありがとうございます。 Maxの条件に一致するものをFindで見つけるという書き方ができるのですね。 ご教示いただきありがとうございます。
guest

0

ベストアンサー

一番シンプルに書くならAggregate<T,T,T>だと思います。
Listの要素にIComparable<T>を実装すれば引数無しのMaxが使えますが、FileInfoではそのままでは使えませんね。

C#

1 2filelist.Aggregate((result, next) => result.Length > next.Length ? result : next); 3

追記
無理矢理FileInfoにIComparableを実装するならこんな感じでしょうか。
自作クラスなら自然な形で実装できるのですが・・・

余談ですが、FileInfoに拡張メソッドでCompareToを定義してみましたがやはりダメでした。

C#

1 2filelist.Select(p => new FileInfoWrapper(p)).Max().FileInfo; 3 4class FileInfoWrapper : IComparable<FileInfoWrapper> 5{ 6 public FileInfo FileInfo { get; } 7 public FileInfoWrapper(FileInfo fileInfo) => FileInfo = fileInfo; 8 9 public int CompareTo(FileInfoWrapper other) 10 { 11 if (FileInfo.Length == other.FileInfo.Length) 12 { 13 return 0; 14 } 15 else if (FileInfo.Length > other.FileInfo.Length) 16 { 17 return 1; 18 } 19 else 20 { 21 return -1; 22 } 23 } 24} 25

投稿2018/07/23 06:50

編集2018/07/23 09:21
YamakawaJunichi

総合スコア632

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

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

退会済みユーザー

退会済みユーザー

2018/07/23 07:11

ご回答ありがとうございます。 Listの要素にIComparable<T>を実装するやり方も気になっていたので、ご教示いただけませんか?
YamakawaJunichi

2018/07/23 09:23

IComparable<T>実装パターンを追記しました。 FileInfoがsealedなためにこのような形になっています。
退会済みユーザー

退会済みユーザー

2018/07/23 09:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問