0

C# でカスタム コレクションを作成します。これにより、その要素の型の 1 つまたはいくつかの指定されたプロパティによる高速検索が提供されます。たとえば、コンポーネントのリストがあり、コンポーネント クラスにはタイプ (内部 .NET プロパティですが、コンポーネントから派生したライトなどの高速検索が必要です) と一意の HashTag (文字列 - 自分のプロパティ) があります。したがって、独自のコレクション型で FindByType(...) および FindByHashTag(...) メソッドのようなものを使用しますが、より「一般的な」方法で行います。

このカスタム コレクションは他のプロパティに簡単に拡張できるはずなので、「ジェネリック」という言葉を使用します。

C# でこれを行うことは可能ですか?

4

2 に答える 2

1

このサンプル コードは、これを行う方法を示しています。これは、インデックスが作成される各プロパティが一意であると想定していることに注意してください。この例では、EmployeeID は従業員ごとに一意です。特殊なケースを処理するには、コードを次のように変更する必要があります。

Dictionary<string, Dictionary<int, List<T>>> intIndexes = new Dictionary<string, Dictionary<int, List<T>>>();

それ以外の:

Dictionary<string, Dictionary<int, T>> intIndexes = new Dictionary<string, Dictionary<int, T>>();

さらに、次のように getByPropertyValue を再定義する必要があります。

public List<T> getByPropertyValue(string propertyName, int propertyValue)

理想的には、プロパティが一意かどうかを示すヒントを提供するとよいでしょう。これは決して完全な実装ではありませんが、リフレクションを使用して目的を達成する方法についてのアイデアを得る必要があります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace IndexerSampleCode
{
    class Program
    {
        static void Main(string[] args)
        {
            Indexer<Employee> indexer = new Indexer<Employee>();
            Employee e = new Employee();
            e.EmployeeID = 45;
            e.FirstName = "Tarik";
            e.LastName = "Hoshan";
            e.BirthDate = new DateTime(1965, 2, 18);
            indexer.add(e);
            var e2 = indexer.getByPropertyValue("EmployeeID", 45);
            Console.WriteLine(e2.FirstName);
            Console.ReadKey();
        }
    }

    class Indexer<T>
    {
        // Collection of dictionories that will be used to index properties of type int
        Dictionary<string, Dictionary<int, T>> intIndexes = new Dictionary<string, Dictionary<int, T>>();

        public Indexer() {
            System.Type indexerType = this.GetType().UnderlyingSystemType;
            System.Type elementType = indexerType.GetGenericArguments()[0];
            var members = elementType.GetProperties();
            // Loop through each property and create a Dictionary corresponding to it
            foreach (var member in members)
            {
                if (member.PropertyType == typeof(int))
                {
                    intIndexes.Add(member.Name, new Dictionary<int, T>());
                }
            }
        }

        public T getByPropertyValue(string propertyName, int propertyValue)
        {
            Dictionary<int, T> index = intIndexes[propertyName];
            return index[propertyValue];
        }

        public void add(T o) {
            var type = o.GetType();
            var members = type.GetProperties();
            foreach (var member in members)
            {
                if (member.PropertyType == typeof(int))
                {
                    var propertyName = member.Name;
                    Dictionary<int, T> index = intIndexes[propertyName];
                    int value = (int) o.GetType().GetProperty(propertyName).GetValue(o, null);
                    index.Add(value, o);
                }
            }
        }
    }

    // Sample test class
    class Employee
    {
        public DateTime BirthDate
        {
            set;
            get;
        }

        public string FirstName
        {
            set;
            get;
        }

        public string LastName
        {
            set;
            get;
        }

        public int EmployeeID {
            set;
            get;
        }
    }

}
于 2013-10-13T06:29:06.717 に答える