C#のリストや配列のデータを元に条件を付けて最大値を取得する小技
リストや配列のデータを元に条件を付けて最大値を取得するだけならforeach文やwhile文などのループは不要です。Linqを使ってお手軽に取得する小技を紹介しますので上手く応用して可読性を上げよう!!
但し、Linqは.NET3.5以上からです。裏技はあるようですがおススメはしません。無用なトラブルを避けるため、また、良い機能の恩恵を受けるため素直に.NETのバージョンを上げる努力をしましょう。
まずは単純にリストや配列の最大値を取得するだけのメソッドです。
Console.WriteLine("最年長:{0}", people.Max(x => x.Age));
次に条件を付けてリストや配列の最大値を取得するメソッドです。たったの一行で済みます。foreach文やwhile文などのループは要りません。因みに途中にある「?」はnullなら処理を行わないというおまじないです。
Console.WriteLine("男性の最年長:{0}", people.Where(x => x.Sex == SEX.Male).Max(x => x?.Age));
最大値の要素を取得するには少し方法が変わります。まず、条件があれば先に絞り込みその上でOrderByで並び替えを行って取得する形になっています。
Console.WriteLine("男性の最年長者:{0}", people.Where(x => x.Sex == SEX.Male).OrderByDescending(x => x.Age).FirstOrDefault()?.Name);
上記の全文を記載しています。
using System;
using System.Collections.Generic;
using System.Linq;
namespace YutaCore.ConsoleApp1
{
/// <summary>
/// 性別
/// </summary>
public enum SEX
{
/// <summary>
/// その他
/// </summary>
Other = 0,
/// <summary>
/// 男性
/// </summary>
Male,
/// <summary>
/// 女性
/// </summary>
Female,
}
/// <summary>
/// 個人情報
/// </summary>
public class human
{
/// <summary>
/// 姓
/// </summary>
public string Sei { set; get; }
/// <summary>
/// 名
/// </summary>
public string Mei { set; get; }
/// <summary>
/// 氏名
/// </summary>
public string Name { get { return (Sei + " " + Mei).Trim(); } }
/// <summary>
/// 性別
/// </summary>
public SEX Sex { set; get; }
/// <summary>
/// 年齢
/// </summary>
public int Age { set; get; }
}
class Program
{
static void Main(string[] args)
{
IEnumerable<human> people = new List<human> {
new human() { Sei = "Sato" , Mei = "Mei" , Sex = SEX.Female, Age = 10 }
, new human() { Sei = "Suzuki" , Mei = "Haruto", Sex = SEX.Male , Age = 15 }
, new human() { Sei = "Takahasi", Mei = "Himari", Sex = SEX.Female, Age = 20 }
, new human() { Sei = "Tanaka" , Mei = "Sota" , Sex = SEX.Male , Age = 25 }
, new human() { Sei = "Ito" , Mei = "Hana" , Sex = SEX.Female, Age = 30 }
};
Console.WriteLine("最年長 :{0}", people.Max(x => x.Age));
Console.WriteLine("男性の最年長 :{0}", people.Where(x => x.Sex == SEX.Male).Max(x => x?.Age));
Console.WriteLine("男性の最年長者:{0}", people.Where(x => x.Sex == SEX.Male).OrderByDescending(x => x.Age).FirstOrDefault()?.Name);
Console.ReadKey(true);
}
}
}