カテゴリー
C

独習C#第3版、P526 要素を表すselect句の使い方

using System;
using System.Linq;

namespace Chapter01All
{

    static class LinqSampleSelect
    {
        public static double Nijyou(this double n)
        {
            return n * n;
        }

        static void Main()
        {
            double[] nums = { -10.0, 16.4, 12.125, 100.85, -2.2, 25.25, -3.5 };
            var sqrRoots = from n in nums
                           where n > 0 | n < 0
                           //where n > 0
                           //select Math.Sqrt(n);
                           select Nijyou(n);
            foreach (double x in sqrRoots)
                Console.WriteLine("{0:#.##}",x);
        }
    }
}

 本の内容は、コメントアウトしているようになってます。少しだけ変えて、拡張メソッドを使ってみました。Sqrtはn>0ですが、二乗の場合はマイアスでもプラスでもいいので、where n > 0 | n < 0としましたが、where nだけだとエラーです。Math.SqrtとNijyouは関数的には同じ値を持つということだと思います。

カテゴリー
C

独習C#第3版、P525 orderby句によるクエリ

using System;
using System.Linq;

namespace Chapter01All
{
    class LinqStringOrderby
    {
        static void Main()
        {
            string[] strs = {".com", ".net", "hsNameA.com","hsNameB.net",
                "test", ".network", "hsNameC.net","hsNameD.com" };
            var netAddrs = from addr in strs
                           //where addr.Length > 4 && addr.EndsWith(".net")
                           orderby addr
                           select addr;
            foreach (var str in netAddrs)
                Console.WriteLine(str);
            Console.WriteLine();

            string[] s = netAddrs.ToArray<string>();
            for (int i = 0; i < s.Length; i++)
                Console.WriteLine(s[i]);
        }
    }
}

 前に出た例題ですが、文字列でorderbyを使ってみました。whereをコメントアウトしてます。最後に配列に入れてみました。配列に入ってないと心配です。”(-“”-)”

カテゴリー
C

独習C#第3版、P524 where句によるデータの絞り込み

using System;
using System.Linq;

namespace Chapter01All
{
    class LinqStringArray
    {
        static void Main()
        {
            string[] strs = {".com", ".net", "hsNameA.com","hsNameB.net",
                "test", ".network", "hsNameC.net","hsNameD.com" };
            var netAddrs = from addr in strs
                           where addr.Length > 4 && addr.EndsWith(".net")
                           select addr;
            foreach (var str in netAddrs)
                Console.WriteLine(str);

            string[] s = netAddrs.ToArray<string>();
            for (int i = 0; i < s.Length; i++)
                Console.WriteLine(s[i]);
        }
    }
}

絞り込んだデータを文字列の配列に変換して見ました。

カテゴリー
C

独習C#第3版、P520 一つのクエリは複数回実行できる

using System;
using System.Collections;
using System.Linq;

namespace Chapter01All
{
    delegate ArrayList Ary(int[] ary, int x, int y);
    class LinqArray
    {
        static void Main()
        {
            int[] test = { 0, 5, 10, -5, 2, 7, -3 };

            Ary aryOp = AryCreate;          //デリゲート
            ArrayList ary = aryOp(test, -99, -1);
            OutAryList(ary);

            var NewAry1 = from n in test    //LINQ
                          where n < 0
                          select n;
            foreach (int x in NewAry1)
                Console.Write(x + ", ");
            Console.WriteLine();

            var NewAry2 = from n in test    //LINQ
                          where n >= 0
                          select n;
            foreach (int x in NewAry2)
                Console.Write(x + ", ");
            Console.WriteLine();

            int[] ans = NewAry2.ToArray();  //intの配列に変換するのだが…
            for (int i = 0; i < ans.Length; i++)
                Console.Write(ans[i] + ", ");
            Console.WriteLine();

            test[2] = -10;
            foreach (int x in NewAry1)      //これだけで再度実行する。
                Console.Write(x + ", ");
            Console.WriteLine();

            foreach (int x in NewAry2)      //NewAry2は単なる配列でないようです。
                Console.Write(x + ", ");
            Console.WriteLine();

        }
        static ArrayList AryCreate(int[] ary, int a, int b)
        {
            ArrayList ans = new ArrayList();
            for (int i = 0; i < ary.Length; i++)
                if (ary[i] >= a & ary[i] <= b)
                    ans.Add(ary[i]);
            return ans;
        }
        static void OutAryList(ArrayList ary)
        {
            foreach (int x in ary)
                Console.Write(x + ", ");
            Console.WriteLine();
        }
    }
}

二度目のクエリの実行に注意。単に配列を参照しているように見ますが。

カテゴリー
C

独習C#第3版、P520 LINQとvar

using System;
using System.Collections;
using System.Linq;

namespace Chapter01All
{
    delegate ArrayList Ary(int[] ary, int x, int y);
    class LinqArray
    {
        static void Main()
        {
            int[] test = { 0, 5, 10, -5, 2, 7, -3 };

            Ary aryOp = AryCreate;          //デリゲート
            ArrayList ary = aryOp(test, -99, -1);
            OutAryList(ary);

            var NewAry1 = from n in test    //LINQ
                          where n < 0
                          select n;
            foreach (int x in NewAry1)
                Console.Write(x + ", ");
            Console.WriteLine();

            var NewAry2 = from n in test    //LINQ
                          where n >= 0
                          select n;
            foreach (int x in NewAry2)
                Console.Write(x + ", ");
            Console.WriteLine();

            int[] ans = NewAry2.ToArray();  //intの配列に変換するのだが…
            for (int i = 0; i < ans.Length; i++)
                Console.Write(ans[i] + ", ");
        }
        static ArrayList AryCreate(int[] ary, int a, int b)
        {
            ArrayList ans = new ArrayList();
            for (int i = 0; i < ary.Length; i++)
                if (ary[i] >= a & ary[i] <= b)
                    ans.Add(ary[i]);
            return ans;
        }
        static void OutAryList(ArrayList ary)
        {
            foreach (int x in ary)
                Console.Write(x + ", ");
            Console.WriteLine();
        }
    }
}

 varはシステムが該当するデータタイプを決めてくれるようですが、例えば上の様に配列にしないと使えないこともあるようです。なので、実行時エラーが起きることもあり得るようです。

カテゴリー
C

デリゲートを使った配列の区分

using System;
using System.Collections;

namespace Chapter01All
{
    delegate ArrayList Ary(int[] ary, int x, int y);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            int[] test = { 0, 5, 10, -5, 2, 7, -3 };

            Ary aryOp = AryCreate;
            var ary = aryOp(test, -99, -1);
            foreach (int x in ary)
                Console.Write(x + " ");
            Console.WriteLine();

            Ary aryOp2 = (aary, n, m) =>
            {
                ArrayList ans = new ArrayList();
                for (int i = 0; i < aary.Length; i++)
                {
                    if(aary[i] >= n & aary[i] <= m)
                    ans.Add(aary[i]);
                }
                return ans;
            };

            var ary2 = aryOp2(test, 0, 99);
            foreach (int x in ary2)
                Console.Write(x + " ");

        }
        static ArrayList AryCreate(int[] ary, int a, int b)
        {
            ArrayList ans = new ArrayList();
            for (int i = 0; i < ary.Length; i++)
                if( ary[i] >= a & ary[i] <= b)
                ans.Add(ary[i]);
            return ans;
        }
    }
}

配列testから負の要素の配列と正の要素の配列を作って見ました。片方はステートメント形式のラムダを使ってます。

カテゴリー
C

独習C#第3版、delegateとステートメント形式のラムダ

using System;
using System.Collections;

namespace Chapter01All
{
    delegate ArrayList Ary(int x);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            Ary aryOp = AryCreate;
            var ary = aryOp(10);
            foreach (int x in ary)
                Console.Write(x + " ");
            Console.WriteLine();

            Ary aryOp2 = n =>
            {
                ArrayList ans = new ArrayList();
                for (int i = 0; i < n; i++)
                {
                    ans.Add(i);
                }
                return ans;
            };

            var ary2 = aryOp2(20);
            foreach (int x in ary2)
                Console.Write(x + " ");
            
        }
        static ArrayList AryCreate(int a)
        {
            ArrayList ans = new ArrayList();
            for (int i = 0; i<a; i++)
                ans.Add(i);
            return ans;
        }
    }
}

using System;
using System.Collections;

namespace Chapter01All
{
    delegate ArrayList Ary(int x, int y);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            Ary aryOp = AryCreate;
            var ary = aryOp(10, 20);
            foreach (int x in ary)
                Console.Write(x + " ");
            Console.WriteLine();

            Ary aryOp2 =( n, m) =>
            {
                ArrayList ans = new ArrayList();
                for (int i = n; i < m; i++)
                {
                    ans.Add(i);
                }
                return ans;
            };

            var ary2 = aryOp2(20, 30);
            foreach (int x in ary2)
                Console.Write(x + " ");
            
        }
        static ArrayList AryCreate(int a, int b)
        {
            ArrayList ans = new ArrayList();
            for (int i = a; i < b; i++)
                ans.Add(i);
            return ans;
        }
    }
}

デリゲートは共通で使えるので、ステートメントの形式のラムダと関数を比較してみました。上のと下のはほぼ同じです。引数が下は2個あります。

カテゴリー
C

独習C#第3版、P518 LINQ 簡単なクエリ

using System;
using System.Linq;

namespace Chapter01All
{
    class LinqSample1
    {
        static void Main()
        {
            int[] ary = { 10, 3, -4, 2, -8, 15 };
            var ans = from n in ary
                      where n > 0
                      select n;
            foreach (int x in ans)
                Console.WriteLine(x);
        }
    }
}

LINQの書き方を覚えれば、ラムダよりは楽そうです。

カテゴリー
C

独習C#第3版、P559 ステートメント形式のラムダの例

using System;
using System.Collections;

namespace Chapter01All
{
    delegate ArrayList PlusElementListUp(int[] x);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            int[] a = { 10, -5, 3, -9, 5 };
            PlusElementListUp op = n =>
            {
                ArrayList data = new ArrayList();
                for(int i=0; i<a.Length; i++)
                {
                    if (a[i] > 0)
                        data.Add(a[i]);
                }
                return data;

            };

            ArrayList b = op(a);
            foreach (int x in b)
                Console.WriteLine(x);
        }
    }
}

delegateを使う場合でも、基本は使わない場合でも、書けることのようです。

using System;
using System.Collections;

namespace Chapter01All
{
    class DelegateLambdaSample2
    {
        static void Main()
        {
            int[] a = { 10, -5, 3, -9, 5 };
            ArrayList b = CheckArray(a);
            foreach (int x in b)
                Console.WriteLine(x);
        }
        static ArrayList CheckArray(int[] ary)
        {
            ArrayList data = new ArrayList();
            int j = 0;
            for (int i = 0; i < ary.Length; i++)
            {
                if (ary[i] > 0)
                    data.Add(ary[i]);
            }
            return data;
        }
    }
}

上の方を先にやって見て、delegateを使う方はそれを変更して見ました。

using System;
using System.Collections;

namespace Chapter01All
{
    delegate ArrayList PlusElementListUp(int[] x);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            int[] a = { 10, -5, 3, -9, 5 };
            PlusElementListUp Op = (int[] n) =>
            {
                ArrayList data = new ArrayList();
                for(int i=0; i<a.Length; i++)
                {
                    if (n[i] > 0)
                        data.Add(n[i]);
                }
                return data;

            };

            ArrayList b = Op(a);
            foreach (int x in b)
                Console.WriteLine(x);
        }
    }
}

 PlusElementsListUpはint[] xの引数を持つので、PlusElementListUp Op = (int[] n)と書かないといけないかもしれませんが、一番上の様でも動くことは動いてるようでした。

カテゴリー
C

独習C#第3版、P559 ステートメント形式のラムダ

using System;

namespace Chapter01All
{
    delegate int Syukei(int x);
    class DelegateLambdaSample2
    {
        static void Main()
        {
            int a = 10;
            Syukei ans = n =>
            {
                int wa = 0;
                for (int i = 0; i <= n; i++)
                    if (n > 0)
                        wa += i;
                return wa;
            };
            Console.WriteLine(ans(a));
        }
    }
}

先ずは簡単な例から。

inserted by FC2 system