1

こんにちは私は、Int、String、Float、またはCustomersという名前の自分の型でも正常に機能するジェネリック配列を作成しました。

Generic Arrayには、Add()、Sort()、ShowAll()関数があり、Add( ) 方法。

出力は次のようなものです GenericArray.Customer

私が値を持ちたかったので、値ではありません。

私はそれを解決しました

public class GArray<T> where T : Customer

しかし、今はInt、Float型のジェネリック配列を作成できません。

これがクラスのADDメソッドとShowAllメソッドです

public void Add(T temp)
        {

            if (index >= values.Length)
            {
                T[] tempArray = new T[values.Length + 1];
                Array.Copy(values, tempArray, values.Length);
                values = tempArray;
            }
            values[index] = temp;
            index++;  
        }

 public void ShowAll()
    {
        for (int i = 0; i < values.Length; i++)
        {
            Console.WriteLine(values[i]);                
        }
    }

値mを追加します

 static void Main(string[] args)
        {                        
            GArray<Customer> customers = new GArray<Customer>(3);
            customers.Add(new Customer(101, "xyz"));
            customers.Add(new Customer(59, "abc"));

            customers.ShowAll();
            }

私は私の友人と話をしました、そして彼は私が自分自身でインデクサーを作成しなければならないと言いました。この場合、customerTypeまたは任意のTypeで正常に機能するインデクサーを作成する方法を教えてください。

4

4 に答える 4

2

質問を理解した場合(出力はGenericArray.Customerのようなものであり、値が必要な値ではありません)、顧客定義に追加する必要があると思います。

public override string ToString()
{
    // return something you want to show to identify your customer
    // e.g. return Name;  
    return ...           
}

説明します。使用するときはConsole.WriteLine(values[i])、C#にコンソールのCustomerオブジェクトに書き込むように指示します...デフォルトの動作であるため、クラスの名前が書き出されます。
Customerクラスで変換するデフォルトの文字列を定義すると、好きなようになります...

于 2011-05-13T08:15:52.910 に答える
0
public T this[int index]
{
  get {return values[index]; }
}
于 2011-05-13T08:11:59.307 に答える
0

あなたの問題は、顧客クラスでToStringをオーバーライドしていないことだと思います。これを行うと、オブジェクトがコンソールにどのように表示されるかが定義されます。

于 2011-05-13T08:19:42.260 に答える
0

ShowAllあなたの実際の問題はさておき、配列の実装にはメソッドの場所がないことを述べておきたいと思います。アレイをコンソールアプリケーションに関連付ける必要があるのはなぜですか?いつか書き直さなくても、Windowsフォームアプリケーションで再利用したいと思いませんか?

次に、.NETには、List<T>必要に応じて動的割り当てを行うがすでにあります。自分で書き直したい場合は、少なくとも配列をより大きなステップで割り当てます(毎回n * 2)。

配列からメソッドを削除するにはShowAll(メソッドが属していない場合)、次のいずれかの方法を検討する必要があります。

IEnumerable<T>a)任意の(リスト、配列、コレクションなど)で機能する拡張メソッドを作成します。

 public static class EnumExt
{
     public static void ShowAll<T>(this IEnumerable<T> list)
     {
         foreach (T item in list)
            Console.WriteLine(item);
     }
}

使用法:

int[] array = new int[] { 1,2,3};
array.ShowAll();

b)または、さらに抽象的にして、実際の作業を実行するためForEachに任意のものを渡す拡張メソッドを作成します。delegate

public static class EnumExt
{
     public static void ForEach<T>(this IEnumerable<T> list, Action<T> action)
     {
         foreach (T item in list)
            action(item);
     }
}

使用法:

int[] array = new int[] { 1,2,3};
// now you are reusing the iterator
// for any action you want to execute
array.ForEach(Console.WriteLine);
// or
array.ForEach(item => Console.WriteLine("My item is: " + item));
于 2011-05-13T08:40:13.837 に答える