[ ik0 @ 17.01.2018. 10:21 ] @
imam ovaj rezultat

<22, 21>
<1, null>
<23, 22>
<2, null>
<21, null>

e sada hocu da dobijem novi dictionary u ovom formatu

<21, null>
<22, 21>
<23, 22>
<1, null>
<2, null>

logika je ova. TKey je id u bazi za neki html element t.e za dropdown, TValue je relacija ako dropdown je zavisan od nekog drugog (primer drzave(id = 1) i gradovi(id = 2), onda bi bilo <1, null>, <2,1>)
e sad iz nekog filtera vadim dictionary koi trebam da podredim kao sto sam dao primer. Neko iskustvo/ideja. Hvala vam.
[ dusans @ 17.01.2018. 10:35 ] @
Da li pored zavisnosti ovi brojevi definišu i nekakav logički redosled (čini se da je tako)?
Zašto rezultat nije ovo?
Code:

<1, null>
<2, null>
<21, null>
<22, 21>
<23, 22>

[ Shadowed @ 17.01.2018. 10:59 ] @
Ako pricamo o Dictionary<TKey, TValue>, on nema definisan order. Npr. ako pogledas dokumentaciju za Key property videces da kaze "The order of the keys in the Dictionary<TKey, TValue>.KeyCollection is unspecified".
Ono sto ti treba je implementacija IEnumerable interfejsa koji brine o redosledu (array, lista, sta ti je vec prakticno). Znaci, ako je ovo bio Dictionary<int, int?>, treba ti ili IEnumerable<KeyValuePair<TKey, TValue>> ili, verovatno bolje IEnumerable<Tuple<TKey, TValue>>.
Ako vec imas Dictionary, ne brini, on vec implementira IEnumerable<KeyValuePair<TKey, TValue>> i mozes lako odraditi sortiranje i konverziju.
Npr. ako bi hteo da sortiras po key-u mogao bi da uradis nesto kao MyDict.OrderBy(pair => pair.Key).ToList()
Posto ti imas neku drugu logiku za sortiranje, mozes da napravis implementiras IComparer i prosledis ga kao drugi parametar (pogledaj https://msdn.microsoft.com/en-us/library/bb549422(v=vs.110).aspx).
[ ik0 @ 17.01.2018. 11:25 ] @
Zato sto prvo moraju da idu dropdown koi imaju zavisnost pa onda drugi elementi.
Citat:
dusans: Da li pored zavisnosti ovi brojevi definišu i nekakav logički redosled (čini se da je tako)?
Zašto rezultat nije ovo?
Code:

<1, null>
<2, null>
<21, null>
<22, 21>
<23, 22>


zasto sto moraju da idu prvo dropdown koi su zavisni jedni od druge pa onda svi ostali ementi.
[ ik0 @ 17.01.2018. 11:29 ] @
Citat:
Shadowed:
Ako pricamo o Dictionary<TKey, TValue>, on nema definisan order. Npr. ako pogledas dokumentaciju za Key property videces da kaze "The order of the keys in the Dictionary<TKey, TValue>.KeyCollection is unspecified".
Ono sto ti treba je implementacija IEnumerable interfejsa koji brine o redosledu (array, lista, sta ti je vec prakticno). Znaci, ako je ovo bio Dictionary<int, int?>, treba ti ili IEnumerable<KeyValuePair<TKey, TValue>> ili, verovatno bolje IEnumerable<Tuple<TKey, TValue>>.
Ako vec imas Dictionary, ne brini, on vec implementira IEnumerable<KeyValuePair<TKey, TValue>> i mozes lako odraditi sortiranje i konverziju.
Npr. ako bi hteo da sortiras po key-u mogao bi da uradis nesto kao MyDict.OrderBy(pair => pair.Key).ToList()
Posto ti imas neku drugu logiku za sortiranje, mozes da napravis implementiras IComparer i prosledis ga kao drugi parametar (pogledaj https://msdn.microsoft.com/en-us/library/bb549422(v=vs.110).aspx).



Hvala na opsirnom i veoma dobrog objasnjena :)

sve to meni jasno, nisam hteo da ulazim duboko duboko ali ja Dictionary<class, Tuple<string, string>> pa ovde ima neki filter i hteo sam da malo uprostim to i uzmem sve to u Dictionary<int, int> i odradim sporedbu i sortiranje. Znaci ovde problem mi je logika za neko "optimalno" resenje. Kako sortirati podredjenje dvojke sa uslovima koi sam naveo gore to me malo muci i ne pada mi na pamet neko pametno resenje.

edit: to je i moja neka logika da implemetiram IComparer, ali kako podrediti, nemogu da nadjem neku logiku... :S

[Ovu poruku je menjao ik0 dana 17.01.2018. u 12:45 GMT+1]
[ Shadowed @ 17.01.2018. 12:01 ] @
Ovo:
Citat:
e sada hocu da dobijem novi dictionary u ovom formatu

<21, null>
<22, 21>
<23, 22>
<1, null>
<2, null>


ti nije u skladu sa ovim:

Citat:
Zato sto prvo moraju da idu dropdown koi imaju zavisnost pa onda drugi elementi.


Ako hoces prvo one kojima vrednost nije null a onda ostale, mozes uraditi sledece:
Code (csharp):
MyDic.Where(pair => pair.value != null).Union(MyDic.Where(pair => pair.value == null))

Ako hoces da pri tome budu i sortirani po key-u:
Code (csharp):
MyDic.Where(pair => pair.value != null).OrderBy(pair => pair.key).Union(MyDic.Where(pair => pair.value == null).OrderBy(pair => pair.key))
[ Mihajlo Cvetanović @ 17.01.2018. 13:19 ] @
Zar ne bi trebalo ovako da bude sortirano (21 ima null, pa ide sa drugima koji imaju null):

Code:
<22, 21>
<23, 22>
<1, null>
<2, null>
<21, null>



Shadowed je blizu, ali ima i prostije rešenje, ThenBy (sortiranje posle ranijeg sortiranja):

Code (csharp):
MyDic.OrderBy(pair => pair.Value != null).ThenBy(pair => pair.key)

[ ik0 @ 17.01.2018. 17:04 ] @
Hvala vam na odgovorima.

lepse da objasnim TKey = id dropdown, TValue = ako je zavisan TKey (id dropdown-na skim je zavisan)

primer

baza

id|Name
1|Country
2|Region
3|City
4|Name
5|Test

dictionary<3, 2>, <4, null> <1, Null>, <2, 1> <5, Null>

e sad <1, null> znaci da treba da je sam ali ima child <2, 1> i onda tu ide druga podredjivanje. Zato sam se i ja malo popetljao...

to je neka moja struktura taka da ne mora da bude dictionary ako imate bilo kakvo drugo resenje slobodno...
[ dusans @ 17.01.2018. 17:22 ] @
Lepo ti to prebaci u kodu iz parova u drvo, posle sortiraš root-ove a i dublje kako ti volja (po broju dece, po broju descendants-a, po čemu god već...)
Posle je trivijalno, prođeš rekurzivno sekvencijalno kroz drvo i napuniš listu.

Znam da izgleda kao da kolješ vola za kilo mesa, ali je rešenje fleksibilnije, sutra kad vidiš da ti treba drugačiji sort,
pa onda više od jednog podređenog, itd... biće ti lakše da dobiješ ono što ti treba. + što tvoji parovi mnogo liče na drvo.

https://stackoverflow.com/ques...-convert-list-of-items-to-tree

[Ovu poruku je menjao dusans dana 17.01.2018. u 18:32 GMT+1]
[ djoka_l @ 17.01.2018. 17:32 ] @
Ta tvoja struktura ima ime i zove se šuma.

Stablo je povezan graf, a ako imaš više stabala, onda je to šuma.

U tvom primeru imaš stabla 21 - 22 - 23, 1, 2

Koliko ja shvatam tvoj problem, želih da ih sortiraš tako da sortiraš prvo po dubini stabla (najdublje stablo je 21-22-23), a zatim po vrednosti korena. Samo stablo ispisuješ nekim metodom obilaska stabla (recimo inorder)

Dakle, prvo stablo sa korenom 21 i njegovi čvorovi u inorder redosledu, zatim stablo sa korenom 1, pa stablo sa korenom 2

21
22
23
1
2
[ ik0 @ 17.01.2018. 20:41 ] @
Trebao iz prve da kopiram realan primer, zivinjavam se zbog toga. Znaci moze da bude <23, null>, <22, 23> <1, 22>, <cmbStreet, 1>. Nemam numericki oreder. Implemetacija IComparer resava stvar (uradio primer ali neka "laka" logika sortiranja).

Moja logika

nadji sve Dictionary<Tkey, TValue> where TValue == null and TKey se nalazi na mesto TValue -> OrderBy(TKey) -> (ovde valjda dobijam sve TKey, TValue Pair koi su zavisni dropdown i su prvi)
kreiram onaj koi je prvi u listu -> onda trazim gde njegov Tkey se ljavlja kao TValue, nadjem -> Kreiram taj -> Trazim dali njegov TKey se javlja kao TValue -> Sve dok TKey se neponavlja kaoi TValue -> Onda kreiram sledeci iz prve liste...

[Ovu poruku je menjao ik0 dana 17.01.2018. u 21:54 GMT+1]

[Ovu poruku je menjao ik0 dana 17.01.2018. u 21:55 GMT+1]