通用数组中的索引器

时间:2011-05-13 08:08:53

标签: c# .net arrays generics indexer

您好 我创建了一个通用数组,适用于Int,String,Float甚至我自己的名为Customers的类型。

Generic Array具有Add(),Sort(),ShowAll()函数,这些函数适用于Int,String甚至是Customer Type 除非我尝试使用showType的showAll()方法显示我通过ADD()方法添加的所有值。

输出就像 GenericArray.Customer

不是我希望拥有值的值。

我通过

解决了这个问题

public class GArray<T> where T : Customer

但现在我无法创建Int,Float类型的Generic Array。

这是Class

的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或任何类型。

4 个答案:

答案 0 :(得分: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类中定义要转换为的默认字符串,使您可以随心所欲......

答案 1 :(得分:0)

public T this[int index]
{
  get {return values[index]; }
}

答案 2 :(得分:0)

我认为您的问题是您没有在客户类中覆盖ToString。这样做 - 它将定义对象应如何在控制台中显示。

答案 3 :(得分:0)

暂时搁置你的实际问题,我想提一下在数组实现中没有ShowAll方法的地方。为什么数组应该绑定到控制台应用程序?您是否不想在不需要重写的情况下将其重新用于Windows Forms应用程序?

接下来,.NET已经有一个List<T>,可以根据需要进行动态分配。如果你想自己再写一次,至少要以更大的步长分配数组(每次n * 2)。

要从数组中删除ShowAll方法(不属于它),您应该考虑采用以下方法之一:

a)创建一个适用于任何IEnumerable<T>(列表,数组,集合等)的扩展方法:

 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));