c'è fondamentalmente qualcosa di sbagliato in quello che cerchi di fare
ammettendo che tu abbia una situazione del genere, con tutte le possibilità del caso
data.jpg
utilizzando il tuo codice perdi elementi
codice:
List<string> arrType = fs.DataTable.AsEnumerable().Select(row => row.Field<String>('TIPO')).Distinct().ToList();
con il select prelevi tutti gli elementi in una nuova lista in forma di stringa,
in seguito esegui il distinct per rimuovere i doppioni,
questo lo fai perchè senza il select il distinct verebbe eseguito sul riferimento e non sul valore,
mentre senza il distinct il select conterrebbe sempre tutti gli elementi.
in seguito vai a iterare sugli elementi stringa di tipo distinti, da qui ricerchi nuovamente in tutti gli elementi
un nuovo riscontro con l'equals e a questo punto ricerchi nuovamente tutti i colori e selezioni solo il primo.
sembra piuttosto contorta come operazione ed inoltre se due "tipo" possiedono colori differenti perdi il contenuto di uno.
non so esattamente l'obbiettivo finale ma sembra esserci comunque qualcosa che non torna.
perchè ammettendo che tutti i tipi dello stesso "tipo" hanno lo stesso colore, concettualmente c'è qualcosa di sbagliato nell'avere righe identiche nella stessa tabella del database.
pertanto diciamo che lo scopo finale è raggruppare per ogni "tipo" tutta una serie di colori distinti e depositarli in un dizionario che come chiave abbia il "tipo" e come valore ha una collezione di colori.
senza il dizionaro potresti fare
codice:
var grouped = Datas
.GroupBy(u => u.Tipo)
.Select(grp => grp.ToList()).ToList();
// output
for (int i = 0; i < grouped.Count; i++)
for (int j = 0; j < grouped.Count; j++)
Console.WriteLine(String.Format("{0} {1}", grouped[i][j].Tipo, grouped[i][j].Colore));
grouped è una collezione che contiene a sua volta una serie di collezioni per ogni "tipo" differente
nota bene che qui un elementi è sparito perchè essendoci un doppione di "tipo2" e "rosso" viene raggruppato (in questo caso).
mentre per la parte con il dizionario e con tutti gli elementi puoi fare
codice:
Dictionary<string, List<Data>> grouped = Datas
.GroupBy(u => u.Tipo)
.ToDictionary(x => x.Key, x => x.ToList());
// output
foreach (var keypar in grouped)
{
Console.WriteLine(keypar.Key);
foreach (var color in keypar.Value)
Console.WriteLine(color.Colore);
}
pertanto in Key possiedi il tipo attuale di raggruppamento, mentre in Value contieni i tuoi oggetti o elementi di colore associati al tipo.
per quanto riguarda le prestazioni l'ultimo codice è quello che reagisce meglio, chiaramente tenendo conto che se nella tabella ci sono tipi uguali con colori uguali non vengon rimossi, pertanto potresti avre doppioni.
però queste sono gestioni dal lato db il quale deve sempre essere in uno stato eccellente essendo la base dati dell'applicativo e dei futuri programme.
pertanto per incrementarne la sicurezza di gestione ti converebbe creare una nuova tabella per "tipo" ed una per "colore" fornite di ID indicizzati come chiavi primarie cosi da evitare false scritture o problemi legati al case sensitive su stringhe, e conseguentemente alla duplicazione dei dati.