LINQで最大値ではなく、最大値を持つ要素を取得したいです。
.NET6以降MaxBy
が追加されたので、非常に簡単になりました^^
Enumerable.MaxBy メソッド (System.Linq) | Microsoft Learn
また、該当のソースコードのforeach文をLINQで書き換えることは可能ですか?
わざわざリストに入れる必要はないですね。
EnumerateFiles
から、そのままLinqに繋げればいいでしょう。
DirectoryInfo.EnumerateFiles メソッド (System.IO) | Microsoft Learn
Listの要素にIComparable<T>を実装するやり方も気になっていたので、ご教示いただけませんか?
こちらも.NET6以降Max
にIComparer<T>
を渡すオーバーロードが追加されています。
Enumerable.Max メソッド (System.Linq) | Microsoft Learn
cs
1//var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "testfolder");
2var path = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
3
4var maxBy = new DirectoryInfo(path)
5 .EnumerateFiles()
6 .MaxBy(s => s.Length);
7
8Console.WriteLine(maxBy?.Name ?? "empty files");
9
10
11var max = new DirectoryInfo(path)
12 .EnumerateFiles()
13 .Max(new FileInfoComparer());
14
15Console.WriteLine(max?.Name ?? "empty files");
16
17class FileInfoComparer : Comparer<FileInfo>
18{
19 public override int Compare(FileInfo? x, FileInfo? y)
20 => Comparer<long?>.Default.Compare(x?.Length, y?.Length);
21}
最大値の要素が複数あった場合、MaxBy
は要素ひとつしか返しません。
すべて列挙したいならMaxBy
は使えません。
一度Max
を求めてWhere
するとか、GroupBy
してMaxBy
するとかひと工夫必要です。
面倒だったらMoreLINQのMaximaを使うのも手です。
cs
1using static MoreLinq.Extensions.MaximaExtension;
2
3int[] array = [-5, 3, -1, 5];
4Console.WriteLine(array.MaxBy(Math.Abs)); // -5
5
6var absMax = array.Max(Math.Abs);
7Console.WriteLine(string.Join(", ", array.Where(x => Math.Abs(x) == absMax))); // -5, 5
8Console.WriteLine(string.Join(", ", array.GroupBy(Math.Abs).MaxBy(g => g.Key)!)); // -5, 5
9Console.WriteLine(string.Join(", ", array.Maxima(Math.Abs))); // -5, 5
LINQ で最小値・最大値を柔軟に求める
c# - Linq MaxBy with all elements? - Stack Overflow
c# - MaxBy() is there a way to get multiple max values? - Stack Overflow
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/07/23 09:41 編集
退会済みユーザー
2018/07/23 11:43
退会済みユーザー
2018/07/23 15:53