您好 我创建了一个通用数组,适用于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或任何类型。
答案 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));