Yuta.NET

C#の条件付きforeach文で繰り返し処理(ループ)を行う小技


ある条件で繰り返し処理(ループ)を行いたいことがあると思います。ここではforeachとLinqを組み合わせることによりお手軽に実現する小技を紹介しますので上手く応用して可読性を上げよう!!

ここではforeach文を使ってインデックスを取得する小技を紹介しますので上手く応用して可読性を上げよう!!

下のコードは条件に一致するリストを取得し、continuebreakを使うことなく繰り返し処理を行っています。あくまで例ですのでif文やswich文の方が良いんじゃない?ってツッコミは無しでお願いします。


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 }
            };
            // 整形用に最大文字数を取得(注:この記述のLinqは.NET3.5以上で使用可)
            int maxLength = people.Max(v => v.Name.Length);

            Console.WriteLine("**** 女性を表示 ****");
            // この記述のLinqは.NET3.5以上で使用可
            foreach (var item in people.Where(x => x.Sex == SEX.Female))
            {
                Console.WriteLine("氏名:{0, -" + maxLength + "}, 性別:{1}", item.Name, item.Sex.ToString());
            }
            Console.WriteLine("\n**** 男性を表示 ****");
            // この記述のLinqは.NET3.5以上で使用可
            foreach (var item in people.Where(x => x.Sex == SEX.Male))
            {
                Console.WriteLine("氏名:{0, -" + maxLength + "}, 性別:{1}", item.Name, item.Sex.ToString());
            }
            Console.WriteLine("\n**** 成人女性を表示 ****");
            // この記述のLinqは.NET3.5以上で使用可
            foreach (var item in people.Where(x => x.Sex == SEX.Female && x.Age >= 20))
            {
                Console.WriteLine("氏名:{0, -" + maxLength + "}, 性別:{1}", item.Name, item.Sex.ToString());
            }
            Console.ReadKey(true);
        }
    }
}