C# قم بتوسيع نوع المصفوفة لزيادة التحميل على المشغلين

StackOverflow https://stackoverflow.com/questions/1804659

سؤال

أرغب في إنشاء صفي الخاص الذي يوسع مجموعة من ints.هل هذا ممكن؟ما أحتاج إليه هو مجموعة من ints التي يمكن إضافتها بواسطة عامل التشغيل "+" إلى صفيف آخر (يتم إضافة كل عنصر إلى كل عنصر)، ومقارنتها بـ "=="، لذلك يمكن (نأمل) استخدامها كمفتاح في القاموس.

الأمر هو أنني لا أرغب في تطبيق واجهة IList بالكامل على صفي الجديد، ولكن أضف هذين العاملين فقط إلى فئة المصفوفة الموجودة.

أحاول أن أفعل شيئًا مثل هذا:

class MyArray : Array<int>

ولكن من الواضح أن الأمر لا يعمل بهذه الطريقة ;).

آسف إذا لم أكن واضحًا ولكني أبحث عن حل لساعات الآن ...

تحديث:

لقد حاولت شيئًا مثل هذا:

class Zmienne : IEquatable<Zmienne>
{
    public int[] x;
    public Zmienne(int ilosc)
    {
        x = new int[ilosc];
    }
    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }
        return base.Equals((Zmienne)obj);
    }
    public bool Equals(Zmienne drugie)
    {
        if (x.Length != drugie.x.Length)
            return false;
        else
        {
            for (int i = 0; i < x.Length; i++)
            {
                if (x[i] != drugie.x[i])
                    return false;
            }
        }
        return true;
    }

    public override int GetHashCode()
    {
        int hash = x[0].GetHashCode();
        for (int i = 1; i < x.Length; i++)
            hash = hash ^ x[i].GetHashCode();
        return hash;
    }

}

ثم استخدمه مثل هذا:

Zmienne tab1 = new Zmienne(2);
Zmienne tab2 = new Zmienne(2);
tab1.x[0] = 1;
tab1.x[1] = 1;

tab2.x[0] = 1;
tab2.x[1] = 1;

if (tab1 == tab2)
    Console.WriteLine("Works!");

ولا أثر.أنا لست جيدًا في الواجهات وطرق التجاوز للأسف :(.أما السبب فأنا أحاول القيام بذلك.لدي بعض المعادلات مثل:

×1 + ×2 = 0.45
×1 + ×4 = 0.2
س2 + س4 = 0.11

هناك الكثير منها، وأحتاج على سبيل المثال إلى إضافة المعادلة الأولى إلى الثانية والبحث في جميع المعادلات الأخرى لمعرفة ما إذا كان هناك أي معادلة تتطابق مع مجموعة x'es التي تؤدي إلى هذه الإضافة.

ربما أنا ذاهب في الاتجاه الخاطئ تماما؟

هل كانت مفيدة؟

المحلول

لنوع واحد، فمن السهل جدا أن تغلف، على النحو التالي. لاحظ أنه بمثابة المفتاح الذي تريد جعله غير قابل للتغيير أيضا. إذا كنت ترغب في استخدام الأدوية، ستكون أكثر صعوبة (طلب مزيد من المعلومات):

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
static class Program {
    static void Main() {
        MyVector x = new MyVector(1, 2, 3), y = new MyVector(1, 2, 3),
                 z = new MyVector(4,5,6);
        Console.WriteLine(x == y); // true
        Console.WriteLine(x == z); // false
        Console.WriteLine(object.Equals(x, y)); // true
        Console.WriteLine(object.Equals(x, z)); // false
        var comparer = EqualityComparer<MyVector>.Default;
        Console.WriteLine(comparer.GetHashCode(x)); // should match y
        Console.WriteLine(comparer.GetHashCode(y)); // should match x
        Console.WriteLine(comparer.GetHashCode(z)); // *probably* different
        Console.WriteLine(comparer.Equals(x,y)); // true
        Console.WriteLine(comparer.Equals(x,z)); // false
        MyVector sum = x + z;
        Console.WriteLine(sum);
    }
}
public sealed class MyVector : IEquatable<MyVector>, IEnumerable<int> {
    private readonly int[] data;
    public int this[int index] {
        get { return data[index]; }
    }
    public MyVector(params int[] data) {
        if (data == null) throw new ArgumentNullException("data");
        this.data = (int[])data.Clone();
    }
    private int? hash;
    public override int GetHashCode() {
        if (hash == null) {
            int result = 13;
            for (int i = 0; i < data.Length; i++) {
                result = (result * 7) + data[i];
            }
            hash = result;
        }
        return hash.GetValueOrDefault();
    }
    public int Length { get { return data.Length; } }
    public IEnumerator<int> GetEnumerator() {
        for (int i = 0; i < data.Length; i++) {
            yield return data[i];
        }
    }
    IEnumerator IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
    public override bool Equals(object obj)
    {
         return this == (obj as MyVector);
    }
    public bool Equals(MyVector obj) {
        return this == obj;
    }
    public override string ToString() {
        StringBuilder sb = new StringBuilder("[");
        if (data.Length > 0) sb.Append(data[0]);
        for (int i = 1; i < data.Length; i++) {
            sb.Append(',').Append(data[i]);
        }
        sb.Append(']');
        return sb.ToString();
    }
    public static bool operator ==(MyVector x, MyVector y) {
        if(ReferenceEquals(x,y)) return true;
        if(ReferenceEquals(x,null) || ReferenceEquals(y,null)) return false;
        if (x.hash.HasValue && y.hash.HasValue && // exploit known different hash
            x.hash.GetValueOrDefault() != y.hash.GetValueOrDefault()) return false;
        int[] xdata = x.data, ydata = y.data;
        if(xdata.Length != ydata.Length) return false;
        for(int i = 0 ; i < xdata.Length ; i++) {
            if(xdata[i] != ydata[i]) return false;
        }
        return true;        
    }
    public static bool operator != (MyVector x, MyVector y) {
        return !(x==y);
    }
    public static MyVector operator +(MyVector x, MyVector y) {
        if(x==null || y == null) throw new ArgumentNullException();
        int[] xdata = x.data, ydata = y.data;
        if(xdata.Length != ydata.Length) throw new InvalidOperationException("Length mismatch");
        int[] result = new int[xdata.Length];
        for(int i = 0 ; i < xdata.Length ; i++) {
            result[i] = xdata[i] + ydata[i];
        }
        return new MyVector(result);
    }
}

نصائح أخرى

وانها ليست يسمح لتوسيع الطبقة مجموعة، انظر المرجع: HTTP : //msdn.microsoft.com/en-us/library/system.array.aspx

وأنت إما أن تنفيذ IList (التي لديها الأساليب الأساسية)، أو تغليف صفيف في صفك وتزويد مشغلي التحويل.

واسمحوا لي أن أعرف إذا كنت بحاجة إلى المزيد من التفاصيل.

هل لك ليس فقط استخدام فئة قائمة؟ هذا لا بالفعل ما الذي تريده عن طريق أسلوب AddRange.

تنفيذ لا تعد ولا تحصى واجهه المستخدم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top