1

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

Generic Array 具有 Add()、Sort()、ShowAll() 函数,这对于 Int、String 甚至 Customer Type 都可以正常工作,除非我尝试使用 CustomerType 的 showAll() 方法来显示我通过 ADD 添加的所有值( ) 方法。

输出类似于 GenericArray.Customer

不是我想要的价值观。

我已经解决了

public class GArray<T> where T : Customer

但现在我无法创建 Int,Float 类型的通用数组。

这是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();
            }

我已经和我的朋友谈过了,他说我必须自己创建索引器。有人可以帮我在这种情况下如何创建索引器,它适用于客户类型或任何类型。

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

I think your problem is that you have not overridden ToString in your customer class. Do that -- it will define how the objects should be displayed in the console.

于 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 回答
0
public T this[int index]
{
  get {return values[index]; }
}
于 2011-05-13T08:11:59.307 回答