Frage

Ich möchte meine eigene Klasse erweitern Array von ints erstellen. Ist das möglich? Was ich brauche, ist Array von ints, die durch „+“ Operator zu einem anderen Array (jedes Element hinzugefügt, um jeweils), und im Vergleich mit „==“ hinzugefügt werden kann, so könnte es (hoffentlich) als Schlüssel im Wörterbuch verwendet werden.

Die Sache ist, ich will nicht ganzen IList-Schnittstelle auf meine neue Klasse implementieren, sondern nur die zwei Betreiber bestehende Array-Klasse hinzufügen.

Ich versuche, so etwas zu tun:

class MyArray : Array<int>

Aber es funktioniert nicht so offensichtlich.;)

Sorry, wenn ich bin unklar, aber ich bin auf der Suche Lösung für Stunden jetzt ...

UPDATE:

habe ich versucht, so etwas wie folgt aus:

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

}

Dann ist es wie folgt verwenden:

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

Und keine Wirkung. Ich bin nicht gut mit Schnittstellen und übergeordneten Methoden leider :( Was Grunde Ich versuche, es zu tun, ich habe einige Gleichungen wie:..

x1 + x2 = 0,45
x1 + x4 = 0,2
x2 + x4 = 0,11

Es gibt viel mehr von ihnen, und ich brauche zum Beispiel erste Gleichung zweiten hinzuzufügen und alle anderen zu suchen, um herauszufinden, ob es eine ist, dass die Kombination von x'es passt dazu führt, dass das Hinzufügen.

Vielleicht werde ich in völlig falsche Richtung?

War es hilfreich?

Lösung

Für eine einzelne Art, ist es recht einfach zu verkapseln, wie weiter unten. Beachten Sie, dass als Schlüssel Sie es unveränderlich machen möchten. Wenn Sie Generika verwenden wollen, wird es schwieriger (für weitere Informationen fragen):

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

Andere Tipps

Es ist nicht zulässig, die Array-Klasse zu erweitern, finden Sie in der Referenz: http : //msdn.microsoft.com/en-us/library/system.array.aspx

Sie können entweder implementieren IList (die die grundlegenden Methoden haben) oder ein Array in Ihrer Klasse kapseln und Konvertierungsoperator zur Verfügung stellen.

Bitte lassen Sie mich wissen, wenn Sie mehr Details benötigen.

Können Sie nicht nur die List-Klasse verwenden? Das bereits tut, was Sie über die AddRange Methode wollen.

implementieren, um die IEnumerable Schnittstelle

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top