Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Vrácení lsitu podle specifického typu

C# .NET .NET (C# a Visual Basic) Vrácení lsitu podle specifického typu American English version English version

Aktivity (1)
Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:13.6.2013 14:07

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:13.6.2013 14:14

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
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Petr Nymsa
Luboš Satik Běhounek:13.6.2013 14:52

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Luboš Satik Běhounek
Petr Nymsa:13.6.2013 14:57

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
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Petr Nymsa
Luboš Satik Běhounek:13.6.2013 15:46

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
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na Luboš Satik Běhounek
Petr Nymsa:13.6.2013 18:39

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š Satik Běhounek
Domiy:13.6.2013 18:46

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
Odpovídá na Luboš Satik Běhounek
Petr Nymsa:13.6.2013 18:47

Omlouvám se :) Ne je tam nutná :)

Nahoru Odpovědět 13.6.2013 18:47
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
Luboš Satik Běhounek
Autoredaktor
Avatar
Odpovídá na Domiy
Luboš Satik Běhounek:13.6.2013 20:01

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
https://www.facebook.com/peasantsandcastles/
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.