

現在。C#の勉強中です。  
まったくの未経験から練習問題を問いているのですが、  
並び替えで行き詰まってしまいました。

以下のコードで、

１．男のみのlist作成  
２．女のみのlist作成  
３．それぞれのlistのA〜Hを昇順に並べる

という処理を実装したいのですが、  
ネットで調べたのですが、  
どういう方法があるのかわかりません。  
ご教授いただけないでしょうか。

[code]

    class Person
        {
            public string Name;
            public string Gender;
            public Person(string name, string gender)
            {
                this.Name = name;
                this.Gender = gender;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                List<string> list = new List<string>();
                list.Add("E 女");
                list.Add("F 女");
                list.Add("G 男");
                list.Add("H 男");
                list.Add("A 女");
                list.Add("B 男");
                list.Add("C 女");
                list.Add("D 男");
    
                List<Person> People = new List<Person>();
    
                foreach (string s1 in list)
                {
                    string[] splitdata = s1.Split(' ');
                    People.Add(new Person(splitdata[0], splitdata[1]));
                }
    
    
                foreach (Person a in People)
                {
                    Console.WriteLine("{0} {1}", a.Name, a.Gender);
                }
            }
        }
    
[/code]

尚、並び替えはLINQを使わず、  
出来るだけ、繰り返しや、分岐処理を使い、  
並び替えたいのです。


CC BY-SA 3.0
2017-05-24T15:13:07.280
34992
2017-07-08T09:23:17.467
2017-05-24T15:18:57.750
23346
23346
question
c# sort
C#の並び替え方法

[code]

    class Person
    {
        public string Name;
    
        public string Gender;
    
        public Person(string name, string gender)
        {
            this.Name = name;
            this.Gender = gender;
        }
    
        public static Person FromString(string text)
        {
            var array = text.Split(' ');
            return new Person(array[0], array[1]);
        }
    }
    
    static void Main(string[] args)
    {
        var list = new List<string>
        {
            "E 女",
            "F 女",
            "G 男",
            "H 男",
            "A 女",
            "B 男",
            "C 女",
            "D 男",
        };
    
        var people = list.Select(_ => Person.FromString(_)).ToList();
    
        Console.WriteLine("people");
        Display(people);
        Console.WriteLine();
    
        var males = people.Where(_ => _.Gender == "男").ToList();
        OrderByName(males);
    
        Console.WriteLine("males");
        Display(males);
        Console.WriteLine();
    
        var females = people.Where(_ => _.Gender == "女").ToList();
        OrderByName(females);
    
        Console.WriteLine("females");
        Display(females);
        Console.WriteLine();
    }
    
    static void Display(IEnumerable<Person> people)
    {
        foreach (var person in people)
        {
            Console.WriteLine($"{person.Name} {person.Gender}");
        }
    }
    
    static void OrderByName(List<Person> people)
    {
        for (var i = 0; i < people.Count - 1; i++)
        {
            for (var j = people.Count - 1; j > i; j--)
            {
                if (people[j].Name[0] < people[j - 1].Name[0])
                {
                    var temp = people[j - 1];
                    people[j - 1] = people[j];
                    people[j] = temp;
                }
            }
        }
    }
    
[/code]

とか。


CC BY-SA 3.0
2017-05-25T03:21:47.200
35000
2017-05-25T03:21:47.200
3033
34992
answer

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Sample
    {
        public class Person
        {
            public string Name { get; set; }
            public string Gender { get; set; }
            public EGender EnumedGender { get; set; }
    
            //入力する値が特定のもので固定されている場合、本来ならこのような列挙型を使う方が好ましいです。
            public enum EGender
            {
                Male,
                Female
            }
    
            public Person(string _name,EGender _gender)
            {
                Name = _name;
                EnumedGender = _gender;
            }
    
            public Person(string _name,string _gender)
            {
                Name = _name;
                Gender = _gender;
            }
    
            //インスタンスの内容を文字列で表示するためToStringメソッドを上書きしています。
            public override string ToString()
            {
                return Name + " " + Gender;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
    
            {
                //Block1.整頓されていないリストを作成
                var list = new List<Person>()
                {
                    new Person("E","女"),
                    new Person("F","女"),
                    new Person("G","男"),
                    new Person("H","男"),
                    new Person("A","女"),
                    new Person("B","男"),
                    new Person("C","女"),
                    new Person("D","男")
                };
    
                //Block2.男女それぞれでリストを作成
                var maleList = new List<Person>();
                var femaleList = new List<Person>();
    
                //Block3.男女の振り分けを行なう
                foreach (var person in list)
                {
                    switch (person.Gender)
                    {
                        case "男":
                            maleList.Add(person);
                            break;
                        case "女":
                            femaleList.Add(person);
                            break;
                    }
                }
    
                //それぞれのリストを整頓。
                maleList = asort(maleList).ToList();
                femaleList = asort(femaleList).ToList();
    
                Display(maleList);
                Console.WriteLine("-------------------------------");
                Display(femaleList);
            }
    
            //ソート部分は面倒なんで省略。
            private static IEnumerable<Person> asort(IEnumerable<Person> target)
            {
                return target.OrderBy(val => val.Name);
            }
    
            //出力。
            private static void Display(IEnumerable<Person> target)
            {
                foreach (var person in target)
                {
                    Console.WriteLine(person);
                }
            }
        }
    }
    
[/code]

きょう日ソート自体は各種言語の標準機能になりつつあるし、他の人に任せるとして……  
提示されているコードについての問題点が幾つかあるのでそっちについて。

  * Listを使用しているのにTにPersonを使用していない。
  * 初期代入の時点でコンストラクタを使用してデータを入れておけばSplitを使う必要性が無い
  * 問題とは関係ないですが、択一形のものならコード中に入れてある列挙型を使用する。択一にstringを使うのはtypoの素です


CC BY-SA 3.0
2017-05-25T07:31:06.350
35005
2017-05-25T07:31:06.350
19429
34992
answer