Back to Top

プログラムの覚書

Category: C#

.NET C#

C# foreachの実装(イテレーター)

C#の構文で foreach は、非常に便利な機能です。

foreach機能を作成するには、IEnumerableやIEnumeratorインターフェースを実装する必要があり、結構面倒です。

そこでC# 2.0ではイテレーター構文というものが追加されています。

ブロック中にyield returnもしくはyield breakを書くことで、通常のメソッドやプロパティとは違った動作になります。

イテレーター基本的動作の確認

static public IEnumerable<int> LoopTo(int st, int ed)
{
    while (st <= ed)
    {
        yield return st++;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    int v = 0;
    foreach (int i in LoopTo(10, 20))
    {
        v += i;
    }
}

上記をデバッガーでトレースしてみれば分かると思いますが、yieldにより特別な動きを実現しています。

 

foreachの機能実装(イテレーター)

class LoopTo
{
    int st, ed;
    public LoopTo(int st, int ed)
    {
        this.st = st;
        this.ed = ed;
    }

    public IEnumerable<int> Enumerable
    {
        get
        {
            while (st <= ed)
                yield return st++;
        }
    }

    public IEnumerator<int> GetEnumerator()
    {
        while (st <= ed)
            yield return st++;
    }
}



private void button1_Click(object sender, EventArgs e)
{
    LoopTo lt1 = new LoopTo(1, 10);

    int v = 0;
    foreach (int i in lt1.Enumerable)
    {
        v += i;
    }


    LoopTo lt2 = new LoopTo(1, 10);

    v = 0;
    foreach (int i in lt2)
    {
        v += i;
    }
}

Enumerable、とGetEnumerator()は同じことができます。通常GetEnumerator()でしょう。

 

Posted in C# | Leave a reply

C# IComparableインターフェイスの実装

C#にてIComparable, IComparable<T> インターフェースの実装について説明します。

IComparable<T>はIComparableのジェネリックです。

配列(Array)などのコンテナークラスでは数値等を格納した場合はソート等ができます。

IComparable、IComparable<T>を継承すれば、自作のクラスでもこれらの機能が使えます。

IComparableインターフェイスには、CompareToメソッドしかありません。のでこれを実装します。

IComparableの実装

 class Person : IComparable, IComparable<Person>
{
    //コンストラクタ
    public Person(string personName)
    {
        this._name = personName;
    }

    public string Name
    {
        get
        {
            return this._name;
        }
    }
    private string _name;

    public int CompareTo(object other)
    {
        return  _name.CompareTo(((Person)other).Name);
    }

    public int CompareTo(Person other)
    {
        return _name.CompareTo(other.Name);
    }
}

上の実装で

CompareTo(object other)がIComparableに

CompareTo(Person other)が IComparable<Person>に相当します。

またArrayListのSortはCompareTo(object other)を使用して並び替えます。

呼び出し側

private void button2_Click(object sender, EventArgs e)
{
    System.Collections.ArrayList al = new System.Collections.ArrayList();
    al.Add(new Person("もも"));
    al.Add(new Person("リンゴ"));
    al.Add(new Person("ナシ"));

    al.Sort();
}

 

Posted in C# | Leave a reply