2009-08-19 21 views
0

Wir haben zwei Satz von String-Arrays, zum Beispiel:C# - Generics- String-Array Verarbeitung

string[] a = new string[] {"value1","value2","value3"}; 
string[] b = new string[] {"value1","value2","value3"}; 

ich eine generische Methode entwickeln, die sollten diese beiden String-Arrays nimmt als Parameter und sollte die kombinierte eine Rückkehr zurück:

public T[] ArrayItms(T1[] a, T2[] b) 
{ 
    return T[]; 
} 

Ich bin etwas verwirrt, so in Generika.

Antwort

7

Sie können LINQ verwenden das zu tun:

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

Oder, um es manuell zu tun, indem Sie die Felder zu kopieren:

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    T[] result = new T[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

In beiden Fällen passen sie nicht initialisierten paremeters (nicht im obigen Beispiel getan Codes).

+0

Ist es nur ich oder würde das scheitern. T1 und T2 sind nicht definiert und nicht in T – LorenVS

+0

umwandelbar. Es gibt so viele schöne neue Methoden, um LINQ zu unterstützen. – akmad

+0

@Loren: Ich habe es jetzt behoben. Es kann jedoch sinnvoll sein, verschiedene Argumenttypen zu verwenden (wenn sie irgendwie ineinander konvertierbar sind). Ich werde es so lassen, wie es jetzt ist, und sehen, was das OP zu sagen hat. –

0

tun es ohne Generika dann mit T.

3

Hier ist eine sehr einfache Implementierung:

public T[] Combine<T>(IEnumerable<T> a, IEnumerable<T> b) 
{ 
    List<T> result = new List<T>(a); 

    result.AddRange(b); 

    return result.ToArray(); 
} 
1

Hmm ... das scheint nicht die richtige Regeln für Generika zu folgen, sollten Sie Ihre Array Argumente denselben Typ haben, so etwas wie dieses:

public T[] ArrayItems<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

Alternativ könnten Sie so etwas tun:

public T[] ArrayItems<T,T1,T2>(T1[] a, T2[]b) where T1 : T where T2 : T 
{ 
    return a.Select(i => (T)i).Concat(b.Select(i=>(T)i)).ToArray(); 
} 
0

Sie LINQ verwenden können, dies zu tun , So dass Sie es zu

public T[] ArrayItms<T>(T[] a, T[] b) 
{ 
    return a.Concat(b).ToArray(); 
} 

Hinweis ändern sollten Sie nicht zwei Array unterschiedlicher Typen kombinieren (T1, T2 -> T, T) und Sie haben Method zu verwenden. Sie sollten die Methode, wie nennen:

ArrayItems<TypeName>(TypeName a, TypeName b); 
+0

Warum spezifizieren Sie den generischen Typparameter explizit? –

6

Arrays sind so 2004.

public IEnumerable<string> ArrayItms(IEnumerable<string> a, IEnumerable<string> b) 
{ 
    return a.Concat(b); 
} 

Sie Ihre Arrays mit dieser Funktion direkt passieren kann, weil Arrays IEnumerable implementieren. Wenn Sie wirklich ein Array-Ergebnis benötigen, rufen Sie nach dem Aufruf der Funktion .ToArray() auf. Oder da es nur ein Einzeiler ist, überspringen Sie die Funktion vollständig und rufen Sie einfach .Concat() auf dem ersten Array.

Beachten Sie, dass dies sehr einfach in eine generische Funktion konvertiert werden kann, die mit jedem Typ funktioniert. Aber bisher hast du nur gesagt, dass dir Saiten wichtig sind.

+0

Beste Lösung. +1 –

1

Wenn beide Anordnungen von der exakt gleichen Art sind, können Sie verwenden:

public static T[] Concatenate<T>(T[] a, T[] b) 
{ 
    if (a == null) throw new ArgumentNullException("a"); 
    if (b == null) throw new ArgumentNullException("b"); 

    T[] result = new T[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

Ansonsten

public static TResult[] Concatenate<TResult, T1, T2>(T1[] a, T2[] b) 
    where T1 : TResult where T2 : TResult 
{ 
    if (a == null) throw new ArgumentNullException("a"); 
    if (b == null) throw new ArgumentNullException("b"); 

    TResult[] result = new TResult[a.Length + b.Length]; 
    Array.Copy(a, result, a.Length); 
    Array.Copy(b, 0, result, a.Length, b.Length); 
    return result; 
} 

tun sollten.

EDIT: Vielleicht Array.Copy() ist nicht dass schnell, so dass es gegen LINQ concat verglichen werden könnte, oder eine stark typisierte Version maßgefertigte werden könnte.

+0

Hat meinen Beitrag bearbeitet, um die Frage jetzt zu beantworten, bitte entfernen Sie den Kommentar. –

+0

Ihre Antwort wurde nicht angezeigt. Ich habe min gelöscht. Ich würde nur hinzufügen: Es funktioniert, weil Array zur Laufzeit in C# seit Version 1 Covariants sind. Die Sicherheit der Kompilierzeit wird durch allgemeine Einschränkungen gewährleistet. – thinkbeforecoding