» »

c# kako v prvi IEnumerable addati samo "Accaptable" tipe iz drugega IEnumerabla

c# kako v prvi IEnumerable addati samo "Accaptable" tipe iz drugega IEnumerabla

Vapo1 ::

torej rad bi funkcijo s katero bi lahko v recimo List-string- addal iz ArrayList-a (ki je poln razlicnih tipov) samo string tipe

rad bi da je funkcija bolj splosno uporabna in da sama pocekira vse te tipe in naredi kar ima za narediti....

torej zanekrat sem takole nekako si zamislil.... in se malo zapletel


public static class MyExtensions
{
                public static void MeIEnumerableAddObjectsOfSameType(this IEnumerable IE, IEnumerable IE_ToAdd)
		{
			Type T_IE = IE.GetType();
			foreach (object o in IE_ToAdd)
			{
				neki v smislu... if(o.GetType() == T_IE ...) IE.Add(o);
				 //torej ce je objekt v IE_ToAdd pravilnega tipa(torej tipa ki ga IE lahko sprejme)  ga adda v IE .. cene ga pa spusti
			}
		}
}


torej potem bi lahko dal:
ArrayList AL = new ArrayList();
AL.Add(1);
AL.Add(33);
AL.Add("abc");
AL.Add(66);

List<string> L = new List<string>();
L.MeIEnumerableAddObjectsOfSameType(AL);


in bi addalo samo string "abc"...

ce bi addal v ArrayList ali pa v List-object- bi se vedno addali vsi elementi... ker ta dva sprejmeta vse tipe bazirane na tipu object (kar pa so vsi tipi v C#)


torej vprasanje je kako preverim kaksne tipe accepta IE ... in potem preverim ce je object tega tipa in ga addam ce je

za zanimivost dodajam se eno funkcijo ki ima podobno uporabnost.. in sicer vse objekte spremeni v string (ToString()) in jih adda v en velik string (vsako v novo linijo) ..... s to funkcijo lahko izi recimi v labelu na formu displayam vsebino keregakoli lista ali arraya (kerikoli IEnumerable tip)
in moram reci da je zelo uporabna.. prej sem moral vsakic posebej pisati ko sem hotel displayat vsebino lista v labelu

public static string MeIEnumerableObjectsToString(this IEnumerable IE)
		{
			StringBuilder SB = new StringBuilder();
			foreach (object o in IE)
			{
				SB.AppendLine(o.ToString());
			}
			return SB.ToString();
		}


ce se komu kaj sanja.. hvala
  • spremenilo: Vapo1 ()

vojko20 ::

public static IEnumerable<T> CreateNeki<T>(ArrayList l)
{
    return from x in l where x.GetType() == typeof(T) select (T)x;
}


če sem prov razumel
aja pa using System.Linq; rabš čist na vrhu.

Vapo1 ::

jaz sem si to zamislil kot extension funkcijo za vse tipe IEnumerable (to so vsi Listi, ArrayList in tudi vsi arrayi (npr string[]) )....

lahko pa bi bilo tudi kot fnkcija ki takea dva IEnumerable sorodna tipa in prvemu adda elemente drugega(seveda samo tiste ki pasejo notri)...


ali pa ce raje namesto IEnumerable uporabimo tip ICollection ki je morda bolj uporaben ker ze exposea metodo Add.. ICollection je tudi soroden vsem Listom in ArrayListu in vsem Arrayem

public static void AddajElementePrvemu(ICollection IC, ICollection IC_ToAdd)
{
       foreach (object OBJ in IC_ToAdd)
	{
		//zdaj tukaj je treba uporabiti Reflection da se ugotovi kaksne tipe sprejema IC... in ce e izkaze da je OBJ kompatibilnega tipa se ga adda
	bool TipaStaKompatibilna = ???';
	if( TipaStaKompatibilna ) IC.Add(OBJ);
	
}


in uporaba bi zgledala takole:


ArrayList AL = new ArrayList();
AL.Add(1);
AL.Add(33);
AL.Add("abc");
AL.Add(66);
 
List<string> ListOfStrings = new List<string>();
List<int> ListOfInts = new List<int>();
List<object> ListOfObjects = new List<int>();

AddajElementePrvemu(ListOfStrings, AL);
//funkcija bi ugotovila da ListOfStrings sprejem samo stringe in bi addala samo "abc";

AddajElementePrvemu(ListOfInts , AL);
//funkcija bi ugotovila da ListOfInts sprejem samo integerje in bi addala samo 1, 33 in 66;

AddajElementePrvemu(ListOfObjects , AL);
//funkcija bi ugotovila da ListOfObjects sprejem samo objecte in bi addala vse 1, 33, "abc" in 66;




ampak uporaba bi zgledala tudi tako da lahko namesto ArrayList vrzes notri tudi kerikoli List ali kerikoli Array
AddajElementePrvemu(ListOfObjects , new string[]{"aaa", "bbb"});
//bi addalo oba stringa
AddajElementePrvemu(ListOfInts , new string[]{"aaa", "bbb"});
//nebi addalo nic


.....

primer iz prejsnjega posta je pa misljen kot extension metoda... torej ubistvu moja fancy Add metoda za vse ICollection tipe oz IEnumerable tipe torej vse Liste ArrayList in arraye vseh tipov - da bi lahko samo kliknil .MojFancyAddMetoda(kerikoliDrugiICollectionTip) ...in bi addalo vse kompatiiblne elemente...

Zgodovina sprememb…

  • spremenilo: Vapo1 ()

commissar ::

en problem: kako bi metoda vedla objekte katerega tip prenesti? Namreč v parametru ne podaš, ArrayList v katerega pa dodajaš pa ima lahko različne tipe že notri.

Se mi pa zdi tak način programiranja (da ena kolekcija drži objekte različnih tipov) slaba praksa. Zato so v .net 2.0 dodali generične kolekcije.

lp

Vapo1 ::

ja... metoda preko reflectiona .GetType() (pomojem se tu kaj najde) pocekira katere tipe target kolekcija sprejme .. in potem doda vse tipe ki jih lahko sprejme... in ravno tu je moj problem.. kako napisati kodo da bo metoda sama ugotovila katere tipe target kolekcija sprejema

commissar ::

ne, getType() vrne tip kolekcije, ne katere tipe sprejema. Če želiš vedeti kateri tipi so v kolekciji moreš čez pregledat celotno kolekcijo. Oz še bolje: naredi nov razred ki podeduje od kakšne kolekcije in dodaj funkcionalnost, ki pregleda vsaj dodan objekt katerega tipa je.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142081 (1205) urosz
»

[Java] Podatkovni tip

Oddelek: Programiranje
233505 (3157) piki12
»

Sortiranje po večih atributih, java

Oddelek: Programiranje
161536 (1302) marjan_h
»

Rekurzija v javi z ArrayList

Oddelek: Programiranje
81458 (1301) marjan_h
»

java dedovanje

Oddelek: Programiranje
51258 (1104) xsenon

Več podobnih tem