LemonteaのUnity部屋

LemonteaのUnity部屋

UnityとかC#のおはなしです~

C# 配列・Listを複数のキーで並べ替える

こんにちは。レモンティーです。

今回は、配列やListの要素を
複数のキーで並び替えます。

やり方は、↓のOrderByメソッドの後にThenByメソッドを使うだけです。
sawalemounity.hatenablog.com

var Party = new List<Human>
            {
                new Human{Name = "あ",Level = 56,Age = 34 },
                new Human{Name = "い",Level = 77,Age = 34},
                new Human{Name = "う",Level = 45,Age = 34},
                new Human{Name = "え",Level = 61,Age = 34},
                new Human{Name = "お",Level = 53,Age = 77},
                new Human{Name = "か",Level = 47,Age = 77},
                new Human{Name = "き",Level = 84,Age = 77},

            };

            var a = Party.OrderBy(x => x.Age)
                         .ThenBy(x => x.Level);

こんな風に書くと

f:id:sawalemontea:20171116145800p:plain

こう出力されます。

Ageで並び替えた後、Ageの値が等しい要素同士を
Levelでもう一度並び替えてくれています。

ちなみに、これだと昇順になりますので
降順にしたい場合はOrderByメソッドと同じく
ThenByDescendingメソッドの方を使います。
使い方は普通のThenByメソッドと同じです。


今回はこれでおしまいです。

sawalemounity.hatenablog.com

C# 配列・Listの重複を無くす

こんにちは。レモンティーです。

今回は、配列やListから要素を重複しないように取り出します。
”無くす”と言ってますが元の配列が書き換わるわけではないです

使うのはDistinctメソッドです。

こんな感じで使うと、重複を取り除いてくれます

var Party = new Human[]
            {
               new Human{Name = "たかし",Job = "戦士"},
               new Human{Name = "あけみ",Job = "僧侶"},
               new Human{Name = "ひろき",Job = "僧侶"},
               new Human{Name = "ゆうや",Job = "魔法使い"},
               new Human{Name = "さとこ",Job = "パラディン"},
               new Human{Name = "としき",Job = "戦士"},
               new Human{Name = "けんた",Job = "魔法使い"},
            };

            var job = Party.Select(x => x.Job)
                           .Distinct()
                           .ToArray();

            Console.WriteLine("職業は以下の{0}種類", job.Length);

            foreach (var j in job)
                Console.WriteLine("{0}",j);

出力はこうなります

f:id:sawalemontea:20171112230028p:plain

SelectメソッドでJobプロパティだけをとりだして
その後重複を無くとっています。

C# 配列・Listのソート・要素の並び換え

こんにちは。レモンティーです。

今回は、配列・Listの要素を並び換え、
上からn個だけ取得します。

先に例を書くとこんな感じです

 var Party = new List<Human>
            {
                new Human{Name = "けんじ",Level = 12},
                new Human{Name = "たかし",Level = 44},
                new Human{Name = "あけみ",Level = 25},
                new Human{Name = "ひろき",Level = 31},
                new Human{Name = "ゆみ",Level = 94},
                new Human{Name = "たけし",Level = 8},
                new Human{Name = "みさと",Level = 67},
                new Human{Name = "はるか",Level = 28},
            };

            var strongmember = Party.OrderByDescending(x => x.Level)
                                    .Take(5);

            foreach (var sm in strongmember)
                Console.WriteLine("{0} (Level:{1})", sm.Name, sm.Level);

これでLevelの高い順に5人だけ取得します。
出力はこうなります

f:id:sawalemontea:20171111160812p:plain


使ったのはLinqのOrderByメソッドです。
これは引数に入れた変数で配列やListをソートしたものを返してくれます。
そのままだと昇順です。

降順にするには、代わりにOrderByDescendingを使います。


Takeメソッドは、配列やリストのはじめから指定した数だけ
要素をとってくれます。
もし要素が3つしかないのに5を引数にわたしても
例外は発生せず、3つだけとってくれます。


今回はこれでおしまいです

sawalemounity.hatenablog.com

C# 文字列の一部を取得する

こんにちは。レモンティーです。

今回は、文字列の一部分だけを抜き出して取得します。

使うのはこれです。

var x = a.Substring(n);
//または
var x = a.Substring(n,L)

上のように書くと
xにaのn文字目以降が入ります。(最後まで)

下側のように書くと
n文字目から数えてL文字がはいります。

ただし、n文字目というのは0から数え始めるので
ちょっと普段の感覚とは異なります。

なので、↓でもでてきたIndexOfメソッドと組み合わせます。
sawalemounity.hatenablog.com

例えば

 var a = new List<string>
            { "私の名前は山田です。好きな食べ物は、しっとりリングドーナツです。",
              "私は田中。好きな食べ物は、カレーです。",
              "私は山本と申します。好きな食べ物は、焼き肉です。",
            };

         foreach(var x in a)
            {
                var q = "好きな食べ物は、";
                var index = x.IndexOf(q)+q.Length;
                var ff = x.Substring(index);
                Console.WriteLine(ff);
            }

こんな風に書くと

f:id:sawalemontea:20171109203938p:plain

のように出力されます。


「です。」が気になるので
「好きな食べ物は、」から「です。」の間を切り取りたいところですが…

今回は山田君が名前の後でも「です。」と言ってるのでめんどいです
これで消す方がよさそうですね。
sawalemounity.hatenablog.com


ちなみに絶対やめたほうがよさそうですが、
これでも一応できます笑

foreach(var x in a)
            {
                var q = "好きな食べ物は、";
                var index = x.IndexOf(q)+q.Length;
                var ff = x.Substring(index);

                var eow = "です。";
                var indexE = ff.IndexOf(eow);
                ff = ff.Substring(0,indexE);

                Console.WriteLine(ff);
            }

f:id:sawalemontea:20171109210044p:plain



今回はこれでおしまいです。

sawalemounity.hatenablog.com

C# 文字列を分割~特定の文字で区切る~

こんにちは。レモンティーです。

今回は文字列の分割です。
「、」など指定した文字で区切って取得します。

var b = "あああいあいああああ"
var a = b.Split('い');

のように書きます。

これだと
a[0] = "あああ";
a[1] = "あ";
a[2] = "ああああ";
みたいに分割して取得できます。

また

var b = "私の名前は山田。好きな食べ物は、しっとりリングドーナツ。";
var a = b.Split( 'て','に','を','は','、','。');

このように複数指定することもできます。
この場合
a[0] = "私の名前";
a[1] = "山田";
a[2] = "好きな食べ物";
a[3] = " ";
a[4] = "しっとりリングドーナツ";

となります。

空になるやつは無視したければ

 var b = "私の名前は山田。好きな食べ物は、しっとりリングドーナツ。";
 var a = b.Split( new[] { 'て', 'に', 'を', 'は', '、', '。'},StringSplitOptions.RemoveEmptyEntries);

このように書けばOKです。

これで
a[0] = "私の名前";
a[1] = "山田";
a[2] = "好きな食べ物";
a[3] = "しっとりリングドーナツ";

となります。


今回はこれでおしまいです。

sawalemounity.hatenablog.com

C# 文字列の一部を検索・削除

こんにちは。レモンティーです。

今回は、

文字列の中から指定した特定の文字列を検索して探し出す
文字列の一部を削除する

の二つです。


検索はIndexOfメソッドでできます。
これは、こんな風に書くと

var index = x.IndexOf("AAA");

文字列xのなかに
AAAという文字列が最初にでてくるのが何文字目かを
変数indexに入れてくれます。
ただし0から始まるので普段の感覚とは1つずれます。
まあこの数字はだいたい変数のまま使うので問題はないのですが…。


そして一部を削除するのはRemoveメソッドでできます。

var y = x.Remove(n,m);

こう書くと
xのn文字目から始まるm文字を削除した文字列がyに代入されます。


試しにこれらをつかうとこんな感じになります

 var original = "ああああああいいいいああああああああ";

 var value = "いいいい";
 var index = original.IndexOf(value);

 var removed = original.Remove(index, value.Length);

これで、removedには
文字列ああああああああああああああ
が代入されます。


今回はこれでおしまいです。

sawalemounity.hatenablog.com

C# 配列・Listに条件に合う要素があるかどうか調べる

こんにちは。レモンティーです。

今回は、配列やListのなかに
特定の条件を満たす要素があるかどうか判定します。

Unityで言うと、
パーティーメンバーを入れてある配列のなかに
レベルが99のメンバーがいるかどうか調べる…とか
全員が僧侶かどうか調べる…
みたいな使い方がありそうですね。

今回はLinqのAnyメソッドとAllメソッドを使いますのでこれを書いておきます

using System.Linq;


ではやってみます

次のようなクラスに対して…

    class Human
    {
        public string Name { get; set;}
        public int Level { get; set; }
        public string Job { get; set; }
    }


こんな感じのパーティメンバーのListがあったとします
(まあUnityではMonoBehaviorがあるのでこんなことは無いかもしれませんが例です)

var Party = new List<Human>
            {
                new Human{Name = "紅茶",Level = 95,Job = "僧侶"},
                new Human{Name = "緑茶",Level =88 ,Job = "戦士"},
                new Human{Name = "抹茶",Level = 99,Job = "飲料"},
                new Human{Name = "麦茶",Level = 91,Job = "パラディン"},
            };


まず、パーティの中にレベル99のメンバーがいるかどうか判定します

 var a = Party.Any(x => x.Level == 99);

これで、変数aにtrueが代入されます。


つぎに、全員が僧侶かどうか調べます

var b = Party.All(x => x.Job == "僧侶");

これで、変数bにfalseが代入されます。


今回はこれでおしまいです。


sawalemounity.hatenablog.com