Newsgroup: it.comp.lang.visual-basic
Titolo: Ordinamento personalizzato con Linq

Ciao,
in Linq per effettuare un ordinamento personalizzato in base ad un
array avente l'ordine predefinito (tipo Gen, Feb, Mar... ecc) come
posso fare?
Grazie mille
Ciao Blacksun

 ha scritto nel messaggio 
news:181d14f2-287d-4808...@y12g2000vbg.googlegroups.com...

Come � fatto lo statement linq che vorresti ordinato in modo personalizzato?
Suppongo che il mese non sia disponibile in forma di Date (altrimenti 
sarebbe banale) ma solo come stringa...
Bye
Raf 

 Ciao Blacksun
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCP
http://mvp.support.microsoft.com
http://blogs.ugidotnet.org/topics
whynot [ at ] topics [ dot ] it

 linq2objects o linq2sql?
rispondo in questo post ma vale per entrambi... :-)
scusate per le poche informazioni che ho dato ma troppe volte do per
scntato una serie di cose che ovviamente non sono vere...
cmq per rispondere a Rafunk ti dico che sono stringhe, io ho fatto
l'esempio dei mesi ma in realta' potrebbero essere cognomi o altro....
mentre per Mauro ti dico che e' linq2object... (sono classi)
Grazie mille!
Ciao BlackSun

 mentre per Mauro ti dico che e' linq2object... (sono classi)
ti faccio l'esempio in C# che ï¿œ piï¿œ semplice che spiegarlo senza 
scrivere codice, lascio a te l'onere di adattarlo al tuo caso e di 
tradurlo :-)
class Program
{
	class Period
	{
		public String Month { get; set; }
	}
	class MonthComparer : IComparer<String>
	{
		readonly String[] order;
		public MonthComparer( String[] order )
		{
			this.order = order;
		}
		public int Compare( string x, string y )
		{
			var indexOfX = Array.IndexOf( order, x );
			var indexOfY = Array.IndexOf( order, y );
			return indexOfX.CompareTo( indexOfY );
		}
	}
	static void Main( string[] args )
	{
		var months = new[] { "September", "July", "March" };
		Print( "Required order", months );
		var periods = new List<Period>()
		{
			new Period(){ Month = "March" },
			new Period(){ Month = "September" },
			new Period(){ Month = "July" }
		};
		Print( "Before Sort", periods.Select( p => p.Month ) );
		var sorted = periods.OrderBy( p => p.Month, new MonthComparer( months 
) );
		Print( "After Sort", sorted.Select( p => p.Month ) );
		Console.Read();
	}
	static void Print( String header, IEnumerable<String> months )
	{
		Console.WriteLine( header );
		Console.WriteLine();
		foreach( var item in months )
		{
			Console.WriteLine( item );
		}
		Console.WriteLine();
	}
}
il tutto gira intorno al "IComparer<T>" che dai in pasto alla OrderBy 
di Linq


 di Linq
Grazie sei stato veramente gentile a scrivermi tutto il codice,
soprattutto visto l'ora (se reale e non sballata dai server).
Mi sa che sei un pendolare :-) se cosi' fosse... come ti capisco.... :-
(
Ora cerco di studiarmi con calma il codice!
Grazie mille :-)
Ciao BlackSun

 Ora cerco di studiarmi con calma il codice!
se hai dubbi non esitare.


 se hai dubbi non esitare.
Dubbi no... ho guardato il tuo codice... funziona ma una volta
tradotto in VB non fa l'ordinamento...
Ora cerco di capire dove sta l'inghippo, sicuramente nella classe
IComparer  ;-)
Grazie :-)
Ciao BlackSun

 IComparer  ;-)
Ho risolto... nella conversione mi creava un Compare1 con i parametri
corretti ma vuota e il codice corretto lo spostava in Compare :-)
Grazie ancora!
Ciao BlackSun

 se hai dubbi non esitare.
Si ho un dubbio. L'ordinamento funziona nel momento in cui l'array dei
mesi e il numero di classi sono identici.
Ma se io avessi un numero di classi maggiori di quelle contenute
nell'array e vorrei metterle in fondo anche non ordinate a che punto
del codice dovrei intervenire?
E come?
Grazie mille
Ciao BlackSun

 E come?
non ho capito, puoi fare un esempio?


 non ho capito, puoi fare un esempio?
Si hai ragione :-) Devo essere piu' chiaro.
Allora immaginiamo di avere l'array che impone l'ordinamento con qusti
valori:
Dim nomi() As String = {"Marco", "Luca", "Paolo", "Gianni"}
Se io nelle classi della query ho "Roberto" esso mi viene messo come
primo risultato e poi tutti gli altri ordinati come ho deciso io
nell'array.
La mia domanda e' questa: come posso fare per far in modo che
"Roberto" venga messo alla fine in quanto non appartenente al mio
array e quindi nella query avere il seguente ordine "Marco", "Luca",
"Paolo", "Gianni", "Roberto", "Carlo"... ?
Grazie mille
Ciao BlackSun

 "Paolo", "Gianni", "Roberto", "Carlo"... ?
devi sofisticare un po' il meccanismo di sort e lo puoi fare con un 
trucchetto come questo:
public int Compare( string x, string y )
{
	var indexOfX = Array.IndexOf( order, x );
	indexOfX = this.Normalize( indexOfX );
	var indexOfY = Array.IndexOf( order, y );
	indexOfY = this.Normalize( indexOfY );
	return indexOfX.CompareTo( indexOfY );
}
Int32 Normalize( Int32 index )
{
	if( index == -1 )
	{
		return Int32.MaxValue;
	}
	return index;
}
Facendogli credere che esiste e sta sempre in una posizione altissima.


 trucchetto come questo:
Vero... non avevo pensato a un trucchetto cosi' semplice ma molto
efficace...
pensavo ad un metodo piu' OOP :-)
Grazie mille!
Ciao BlackSun