【问题标题】:Indexer in Generic Array通用数组中的索引器
【发布时间】:2011-05-13 08:08:52
【问题描述】:

嗨 我创建了一个通用数组,它适用于 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();
            }

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

【问题讨论】:

  • Indexer 是指枚举器还是一些GetValueByIndex(int) 函数?
  • 你为什么不扩展List&lt;T&gt;?它已经在后台进行了动态分配(并且效率更高,因为您每次都以 1 个字节的增量重新分配)。
  • Groo 我希望我 cld 扩展了 List 但是我的老师有限制所以我必须扩展简单的 Array :)

标签: c# .net arrays generics indexer


【解决方案1】:

我认为,如果我理解了这个问题(输出类似于 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 类中定义要转换为的默认字符串,让您随心所欲...

【讨论】:

  • 您不需要将 ToString 调用添加到 Console.WriteLine 调用中 -- Console.WriteLine 已经在调用 ToString。 System.Object 中的默认实现仅显示类名。 OP 需要做的就是添加覆盖。
  • 你理解问题 Rite 和你的解决方案解决了我的问题,谢谢你的帮助.. 非常感谢 :) 你救了我的命:d
  • @user751959:如果我真的可以通过在键盘上打字来挽救一些生命,那将是非常棒的!!! ;) 很高兴为您提供帮助 :)
【解决方案2】:
public T this[int index]
{
  get {return values[index]; }
}

【讨论】:

  • 我已经尝试过你的解决方案,但它对我没有帮助,请你详细说明一下。如果我能够通过索引器解决它会很好
【解决方案3】:

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

【讨论】:

  • 我也这么认为,我已经发布了一些代码......这让我觉得我已经理解了这个问题:)
  • 是的,我正在手机上打字,所以我花了很长时间才得到这个简短的答案。 :-(
【解决方案4】:

暂时搁置您的实际问题,我想提一下,在数组实现中没有ShowAll 方法的位置。为什么要将数组绑定到控制台应用程序?您不想有一天将它重用于 Windows 窗体应用程序而无需重写吗?

接下来,.NET 已经有了一个List&lt;T&gt;,它会根据需要进行动态分配。如果您确实想自己重新编写它,至少要以更大的步骤分配数组(每次 n*2)。

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

a) 创建一个适用于任何IEnumerable&lt;T&gt;(列表、数组、集合等)的扩展方法:

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

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2016-01-31
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多