2

我尝试了下面的解决方案,但我不喜欢它。我正在寻找扩展类,而不是封装一个double[].

谢谢。

编辑:我们需要使用 .NET 2.0

public class DoubleArray : IList, ICloneable
{

    protected double[] items;

    /// <summary>
    /// Gets the last item in the array.
    /// </summary>
    public double Last { get { return items[items.Length-1]; } }

    /// <summary>
    /// Gets the number of items in the array.
    /// </summary>
    public int Length { get { return items.Length; } }

    /// <summary>
    /// Number of items constructor.
    /// </summary>
    /// <param name="len">Number of items</param>
    public DoubleArray(int len)
    {
        items = new double[len];
    }      

    public double this[int index]
    {
        get { return items[index]; }
        set { items[index] = value; }
    }

    public bool IsReadOnly
    {
        get { return items.IsReadOnly; }
    }

    public bool IsFixedSize
    {
        get { return items.IsFixedSize; }
    }

    public void CopyTo(Array array, int index)
    {
        items.CopyTo(array, index);
    }

    public IEnumerator GetEnumerator()
    {
        return items.GetEnumerator();
    }

    public object SyncRoot
    {
        get { return items.SyncRoot; }
    }

    public bool IsSynchronized
    {
        get { return items.IsSynchronized; }
    }

    object ICloneable.Clone()
    {
        return items.Clone();
    }

    #region ICollection and IList members implementation

    // hides this members from intellisense, see: http://stackoverflow.com/questions/10110205/how-does-selectedlistviewitemcollection-implement-ilist-but-not-have-add

    int ICollection.Count
    {
        get { return items.Length; }
    }

    int IList.Add(object value)
    {
        throw new NotImplementedException();
    }

    bool IList.Contains(object value)
    {
        throw new NotImplementedException();
    }

    void IList.Clear()
    {
        throw new NotImplementedException();
    }

    int IList.IndexOf(object value)
    {
        throw new NotImplementedException();
    }

    void IList.Insert(int index, object value)
    {
        throw new NotImplementedException();
    }

    void IList.Remove(object value)
    {
        throw new NotImplementedException();
    }

    void IList.RemoveAt(int index)
    {
        throw new NotImplementedException();
    }

    object IList.this[int index]
    {
        get { throw new NotImplementedException(); }
        set { throw new NotImplementedException(); }
    } 

    #endregion

}
4

5 回答 5

2

你不能使用 LINQ 并调用

array.Last()

? (.NET 3.5 及更高版本和“使用 System.Linq;”)

.NET 2 解决方案:(将触发 IndexOutOfRange exc. in case of Count == 0)

public class MyList<T> : List<T>
{
    public T Last
    {
        get
        {
             return this[this.Count - 1];
        }
    }
}
于 2012-07-17T08:31:21.283 回答
2

由于您不能使用 Linq,扩展方法或其他只需使用静态方法添加 Utility 类:

public static class ArrayUtility
{
    public static double Last(double[] items)
    {
        return items[items.Length -1]);
    }
}

否则,如果您不必使用array,只需使用List<double>

如果你去使用List<double>. 打电话Add(YourNewDouble)会成功的。如果您想要队列或堆栈行为。Net 有相应的类 : Queue<T>, Stack。

于 2012-07-17T08:41:47.070 回答
1

这是一个让我满意的解决方案。C# 3.0 扩展可以在 .NET 2.0 中使用,只需添加以下代码:

#if NET20
namespace System.Runtime.CompilerServices
{
    [AttributeUsageAttribute(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
     public class ExtensionAttribute : Attribute
    {
    }
}
#endif

之后,您可以使用以下扩展方法(以及许多其他方法):

public static class DoubleArrayExtension
{
    // This is the extension method.
    // The first parameter takes the "this" modifier
    // and specifies the type for which the method is defined.       
    public static double Last(this double[] items)
    {
        return items[items.Length - 1];
    }

}

感谢您的所有提示和建议!

于 2012-07-18T08:24:24.313 回答
0

使用类List或者你需要实现相同的功能

如果List不适合使用静态方法Array.Resize(param)Array.Copy(param)

于 2012-07-17T08:30:48.653 回答
0

添加using System.Linq;到您的文件顶部,以便能够在您的代码中使用 Linq 表达式。items.Last()将返回最后一个数组项。

这是一个完整的 Linq 方法列表

于 2012-07-17T08:31:50.557 回答