C# 泛型数组中的索引器
嗨 我已经创建了一个通用数组,它可以很好地用于Int、String、Float甚至我自己命名的客户类型 泛型数组有函数Add()、Sort()、ShowAll(),这些函数对于Int、String甚至客户类型都可以正常工作 除非我尝试为CustomerType显示所有()方法,该方法显示我通过ADD()方法添加的所有值 输出类似于C# 泛型数组中的索引器,c#,.net,arrays,generics,indexer,C#,.net,Arrays,Generics,Indexer,嗨 我已经创建了一个通用数组,它可以很好地用于Int、String、Float甚至我自己命名的客户类型 泛型数组有函数Add()、Sort()、ShowAll(),这些函数对于Int、String甚至客户类型都可以正常工作 除非我尝试为CustomerType显示所有()方法,该方法显示我通过ADD()方法添加的所有值 输出类似于 GenericArray.Customer 不是我想要的那些值 我已经解决了 公共类GArray,其中T:Customer 但是现在我不能创建Int,Float类型的
GenericArray.Customer
不是我想要的那些值
我已经解决了
公共类GArray,其中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]);
}
}
public void Add(T temp)
{
如果(索引>=values.Length)
{
T[]tempArray=新的T[values.Length+1];
复制(值、临时数组、值、长度);
值=临时数组;
}
数值[指数]=温度;
索引++;
}
公屋空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置空置
{
for(int i=0;i
我正在添加这些值
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();
}
static void Main(字符串[]args)
{
加里客户=新加里(3);
添加(新客户(101,“xyz”);
添加(新客户(59,“abc”);
customers.ShowAll();
}
我和我的朋友谈过,他说我必须自己创建索引器。有人能帮我吗?在这种情况下,如何创建索引器,它可以很好地用于customerType或任何类型 我认为,如果我理解这个问题(输出类似于GenericArray.Customer,而不是我想要的值),您应该添加客户定义:
public T this[int index]
{
get {return values[index]; }
}
public override string ToString()
{
// return something you want to show to identify your customer
// e.g. return Name;
return ...
}
我解释一下:当您使用Console.WriteLine(值[I])
时,您告诉C#向Console客户对象写入内容。。。然后写出类的名称,因为这是默认行为。在Customer类中定义要转换为的默认字符串会使您满意…我认为您的问题在于您没有在Customer类中重写ToString。这样做——它将定义对象在控制台中的显示方式。暂时抛开您的实际问题不谈,我想指出的是,在数组实现中没有放置
ShowAll
方法的位置。为什么要将阵列绑定到控制台应用程序?您不想有朝一日将其重新用于Windows窗体应用程序,而无需重写它吗
接下来,.NET已经有了一个列表
,它可以根据需要进行动态分配。如果您确实想自己再写一次,至少要以更大的步骤分配数组(每次n*2)
从数组中删除<代码> Studio方法(不属于它),您应该考虑采用以下方法之一:
a) 创建适用于任何IEnumerable
(列表、数组、集合等)的扩展方法:
b) 或者,更抽象地创建一个ForEach
扩展方法,在该方法中,您将传递一个任意的委托
,以执行实际工作:
public static class EnumExt
{
public static void ForEach<T>(this IEnumerable<T> list, Action<T> action)
{
foreach (T item in list)
action(item);
}
}
lmgtfy?所谓索引器,您是指枚举器还是某些
GetValueByIndex(int)
函数?为什么不扩展List
?它已经在引擎盖下进行了动态分配(而且效率更高一些,因为每次都是以1字节的增量重新分配)。Groo我希望我的cld有扩展列表,但我的老师有限制,所以我必须扩展简单数组:)我也这么认为,我已经发布了一些代码。。。这让我觉得我已经理解了这个问题:)是的,我在打电话,所以花了很长时间才得到那个简短的答案-(您不需要将ToString调用添加到Console.WriteLine调用--Console.WriteLine已在调用ToString。System.Object中的默认实现仅显示类名。OP需要做的只是添加覆盖。您理解了问题,您的解决方案解决了我的问题谢谢您的帮助..非常感谢:)你救了我的命:d@user751959:如果我真的能通过在键盘上打字来挽救一些生命,那就太棒了!!!;)很高兴帮助你:)我已经尝试过你的解决方案,但没有帮助我。你可以再详细说明一下。如果我能通过索引器解决它,那就太好了
int[] array = new int[] { 1,2,3};
array.ShowAll();
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));