Return kilku wartosci ?

Odpowiedz Nowy wątek
2011-10-06 10:57
asp
0

Panowie mam taki kawalek kodu:

ArchiwumDataContext db = new ArchiwumDataContextFabryka().ArchiwumDataContext();
            var doki = new SzukajKasujPublikator().GetUpdate(publikator, rok, numer, str, dodatek, login, czyMoje, db);
            return doki.Select(d => d.P180);

teraz chcialbym dodatkowo,czyli nie tylko zwrocic to co widzicie P180 ale jeszcze np jakas inna wartosc np takie dwie:
return doki.Select(d => d.P180);
return doki.select(d=>d.JakasInnaWartosc);

Ale nie wiem jak to zrobic,tzn wiem ze moge sobie utworzyc klase z getami i setami itd ale nie mozna w jakis prostszy sposob na szybko zrobic czegos w stylu dwoch return'ow ?

Pozostało 580 znaków

2011-10-06 11:18
0

chyba nie można zwrócić 2 wartości poprzez return ale możesz wysłać przez referencje.

Pozostało 580 znaków

2011-10-06 12:36
0

nie, możesz zwrócić tablicę, klasę, strukturę lub cokolwiek co przechowuje kilka wartości


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-10-06 12:37

Pozostało 580 znaków

2011-10-06 12:51
0

Może yield return przejdzie? Zwracana wartość to IEnumerable.

http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx

Pozostało 580 znaków

2011-10-06 13:02
0
        struct StrukturaPomocnicza
        {
            public int P180;
            public int JakasInnaWartosc;
            public StrukturaPomocnicza(int _P180, int _JakasInnaWartosc)
            {
                P180 = _P180;
                JakasInnaWartosc = _JakasInnaWartosc;
            }
        }

...
return doki.Select(d=>new StrukturaPomocnicza(d.P180, d.JakasInnaWartosc));

a jeżeli nie musisz tego zwracać z funkcji, można tak:

var wynik = doki.Select(d => new { d.P180, d.JakasInnaWartosc });

ale nie da się tego zwrócić returnem - najwyżej jako IEnumerable<object>, bo typ jest nienazwany (konkretniej, jest to IEnumerable<typ bez nazwy>). Jest na to obejście, ale to już lepiej zdefinować konkretną strukturę.

edytowany 3x, ostatnio: Azarien, 2011-10-06 13:17

Pozostało 580 znaków

2011-10-06 13:56
ŁF
0
Azarien napisał(a)

struct StrukturaPomocnicza
{
public int P180;
public int JakasInnaWartosc;
public StrukturaPomocnicza(int _P180, int _JakasInnaWartosc)
{
P180 = _P180;
JakasInnaWartosc = _JakasInnaWartosc;
}
}

...
return doki.Select(d=>new StrukturaPomocnicza(d.P180, d.JakasInnaWartosc));


można krócej, nie definiując konstruktora:
```csharp
struct SomeContainer { public int P180, OtherValue; }
...
return doki.Select(d=>new SomeContainer{P180 = d.P180, OtherValue = d.OtherValue});

oczywiście ma to swoje plusy i minusy. plus to banalnie prosta deklaracja struktury/klasy, minus to konieczność podawania nazw pól i - jeszcze większy minus - możliwość nienadania wartości niektórym polom.

a tak przy okazji:

  • nic niemówiące nazwy pól typu "P180" zemszczą się w przyszłości.
  • język polski fatalnie wygląda w nazwach, a za mieszanie tam polskiego z angielskim powinno się ucinać klawiaturę przy samym zasilaczu (np. ArchiwumDataContextFabryka).
  • połączenia z bazą danych się ZAMYKA! ogólnie wszystkie klasy implementujące interfejs IDisposable powinno się tworzyć wewnątrz using.

edytowany 3x, ostatnio: ŁF, 2011-10-06 14:02

Pozostało 580 znaków

2011-10-06 14:16
asp
0

To nie sa pola tylko tabele bazy danych,ja tego nie tworzylem.P180 to jest jedne z atrybutow z tabeli Doks.

to nie są ani tabele, ani atrybuty, tylko odwzorowania na kolumny tabel. i owszem, zdaję sobie z tego sprawę, sygnalizuję jedynie, że nazwa taka jest do dupy, abstrahując od tego na jakim poziomie została stworzona, a baza danych pozwala na zmianę nazw swoich obiektów. "Doks" też brzmi ciekawie. - ŁF 2011-10-06 15:36

Pozostało 580 znaków

2011-10-06 15:15
0

można krócej, nie definiując konstruktora:
próbowałem tak, i dostawałem błąd kompilacji. ale może „coś źle robiłem”, twój przykład działa.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0