PDA

View Full Version : [C# 2.0]Implementazione di List<T>.Sort e .FindAll


RaouL_BennetH
18-06-2010, 00:49
Buonasera a tutti :)

Problemino della nottata:

Devo implementare dei metodi definiti in un'interfaccia, in particolare:



List<T> SortedByList(string dataPropertyName);

List<T> GetByName(string dataPropertyName, string filter);



Ora, lasciando perdere il fatto che per me avrebbe avuto più senso una cosa del genere:



//interfaccia
List<T> GetEntityList();

//classe : interfaccia
List<T> GetEntityList()
{
blablaCode;
return someList;
}

//.....
List<Pippo> lista = classe.GetEntityList();
lista.FindAll(delegate(Pippo p1)
{
return p1.SomeProperty.Contains(someString);
});

//e fare lo stesso per Sort(delegate (Pippo p1, Pippo p2) { return CompareTo etc....



vabbè... già è tantissimo che mi pagano per imparare :D

ad ogni modo, non riesco a comprendere come implementare l'interfaccia in una classe generica, per es.:



List<T> GetByName(string dataPropertyName, string filter)
{
List<T> filteredList = base.GetEntityList();
filteredList.FindAll(
delegate(typeof(T))
{
return typeof(T).GetProperty(dataPropertyName) <- qui il mio pensare si ferma...
});
return filteredList;
}


Si ferma perchè non ho disponibilità di un metodo "Contains".

Grazie a tutti :)


RaouL.

RaouL_BennetH
18-06-2010, 09:00
La notte porta consiglio (spero che sia quello giusto....)



public List<T> GetByName(string dataPropertyName, string filter)
{

List<T> filteredList = base.GetAll();
PropertyInfo pInfo = typeof(T).GetProperty(dataPropertyName);
filteredList.FindAll(
delegate(T t)
{
return pInfo.Name.Contains(filter);
});
return filteredList;
}




EDIT: :muro:

Ho sognato male evidentemente :(

RaouL_BennetH
19-06-2010, 11:41
up :)

RaouL_BennetH
19-06-2010, 13:11
Ho finalmente risolto mediante un Predicate<T>



private string dataPropertyName;
private string filter;

public List<T> FilterdList(string dataPropertyName, string filter)
{
this.dataPropertyName = dataPropertyName;
this.filter = filter;
List<T> filteredList = baseList.Getall();
return filteredList.FindAll(PredicateTest);
}

private bool PredicateTest(T obj)
{
return obj.GetType().GetProperty(dataPropertyName).GetValue(obj, null).ToString().Contains(filter);
}