Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Ahoj, z generecitidou jsem nikdy moc nedělal a neívm jak přesně udělat následující metodu.

Mám třídu která má list GameObject. Do tohoto listu ale házím různé potomky - Tiles,Invento­ryItem,.....

Když použiju OfType<T>() vrátí to hledaný typ + případné potomky. Jak vrátit přímo daný typ ? Lze to přes LINQ nebo přes vlastní metodu ?

Díky ;)

Odpovědět 13.6.2013 14:07
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Petr Nymsa
Petr Nymsa:

Sorry za překlepy ! :D Máme sítě, tak nesleduju pořádně co a jak píšu

Nahoru Odpovědět 13.6.2013 14:14
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Běhounek (Satik):

Použít můžeš obojí, v linq dotazu bys jen hledal takové záznamy, jejichž
.GetType() jsou shodné s typem, který chceš vytáhnout.

Nahoru Odpovědět 13.6.2013 14:52
:)
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Nymsa:

Mohl by jsi napsat jak by vypadal vlastní metoda přes generecitidu ? Takto je něco málo špatně .. Díky :)

private List<T> ReturnType<T>()
       {

           var res = list.Where(x => x.GetType() == typeof(T));

           return res.ToList();
       }
Nahoru Odpovědět 13.6.2013 14:57
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Petr Nymsa
Luboš Běhounek (Satik):

Třeba takhle:

public static class ListExtension
{
    public static List<TOut> ReturnType<T, TOut>(this List<T> list)
    {
        return list.Where(x => x.GetType() == typeof(TOut)).OfType<TOut>().ToList<TOut>();
    }
}

a použití:

class Enemy : GameObject {...}

// list vsech objektu
List<GameObject> objekty = ...
...
// vrati z listu vsech objektu jen enemace
List<Enemy> nepratele = objekty.ReturnType<GameObject, Enemy>();
Editováno 13.6.2013 15:47
Nahoru Odpovědět  +1 13.6.2013 15:46
:)
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Petr Nymsa:

Super ! :) Btw není T zbytečné ? Nestačí jenom TOut ?

Nahoru Odpovědět 13.6.2013 18:39
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Domiy
Neregistrovaný
Avatar
Odpovídá na Luboš Běhounek (Satik)
Domiy:

T se v LINQ používá střídměji - mnohem více IEnumerable. Proč tedy vracet List? (Pokud bude chtít aplikovat opět LINQ, bude zase přetypovávat.)

 
Nahoru Odpovědět 13.6.2013 18:46
Avatar
Petr Nymsa
Redaktor
Avatar
Nahoru Odpovědět 13.6.2013 18:47
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Odpovídá na Domiy
Luboš Běhounek (Satik):

Puvodne jsem nad tim uvazoval, ze bych vracel jen IEnumerable, ale pak jsem si rek, ze kdyz chce list, budu vracet list, upravit si to uz muze podle potreb.

Nahoru Odpovědět 13.6.2013 20:01
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.