2009-10-08 11 views
6

Mam funkcję, która musi zwrócić dwa ciągi. I już za dwa różne sposoby, aby to zrobić:Powrót KeyValuePair lub użyj zmiennej w C#?

string first = "this is first"; 
string second = "this is second"; 
KeyValuePair<string, string> ReturnPair() 
{ 
    return new KeyValuePair<string, string>(first, second); 
} 
string ReturnOne(out string other) 
{ 
    other = second; 
    return first; 
} 

chciałbym użyć <> podejście KeyValuePair ale czuję, że jestem nadużywania cel, dla którego cel ten został utworzony.

Moje pytania:

  1. Czy istnieje lepszy sposób, aby powrócić 2 sznurki w tym przykładzie?
  2. Czy jest coś złego w zwrocie KeyValuePair?

Odpowiedz

20

Chociaż nic technicznie złego powrocie KeyValuePair, rzecz wracasz nie koncepcyjnie „klucz-wartość” parę. To prosta para.

Alternatywnie można użyć Tuple, który jest dostępny w .NET 4.0 lub w międzyczasie zadeklarować your own structure.

Zwykle radzę przed parametrami zwracanych krotek w stosunku do out. Zwłaszcza, gdy używasz LINQ i funkcjonalnych konstrukcji językowych, praca z parametrami out jest żmudna.

+0

Prawidłowo, rzeczą, którą wracam, NIE jest KeyValuePair i dlatego nie chcę używać tej konstrukcji. To jest Tuple. Dzięki za twoje pomysły. – Guy

3

Moja osobista opinia byłaby

void ReturnTwo(out string one, out string two) 
{ 
    // do assignments 
} 

czuję, że to sprawia, że ​​bardziej wyraźny na jakie wartości są zwracane.

6

Jeśli dane są logicznie ze sobą powiązane, ale jeden nie jest logicznym kluczem drugiego, zdefiniowałbym nowy typ, który je enkapsuluje.

Jeśli jeden jest kluczem do drugiego, użyłbym NameValuePair.

+0

Chciałem to również powiedzieć. Jeśli na przykład reprezentujesz dwa nazwiska osoby, możesz mieć klasę z własnością FirstName i LastName. To otwiera możliwość utworzenia gettera FullName w przyszłości. – StriplingWarrior

6

To byłaby moja preferowana metoda. KeyValuePair jest tak gadatliwy.

String[] ReturnPair() 
{ 
    return new [] { first, second }; 
} 
+0

haha ​​śmieszne .. +1 – nawfal

0

Jest podobne pytanie z wieloma odpowiedziami: How do you return two values from a single method?

Z „czystego kodu” perspektywy, przy użyciu parametrów „out” do powrotu tych dwóch ciągów jest złe. Zakładając, że nie masz czasu na refaktoryzację/oczyszczenie swojego projektu, rozwiązanie proponowane przez Johna Krafta jest zdecydowanie do przyjęcia.

1

Nie jestem fanem wielu produktów wyjściowych. Nie lubię też używać pary wartości klucza, jeśli pierwszy ciąg nie jest naprawdę kluczem. Moja sugestia to powrót List <string>. Zapewni to elastyczny i stabilny podpis. Na przykład, jeśli później zdecydujesz, że chcesz zwrócić 3 lub 4 ciągi, możesz po prostu zaktualizować logikę wewnątrz metody bez małpowania z podpisem.