2009-01-29 10 views
9

Me gusta mucho el sonido de este ElementAtOrDefaultOperator para usar con listas genéricas, pero no puedo entender cómo definir un tipo predeterminado para mi lista de objetos. Por lo que entiendo, el valor por defecto será nulo si tengo una lista de objetos como la siguiente, pero me gustaría devolver mi propia versión de un objeto predeterminado con los valores adecuados. Esto es lo que quiero decir:LINQ Cómo definir un tipo predeterminado para usar con ElementAtOrDefault Operador

ClassA { 

string fieldA; 
string fieldB; 
ClassB fieldC; 

//constructor 

} 

List<ClassA> myObjects = new List<ClassA>(); 

myObjects.Add(//new object) 
myObjects.Add(//new object) 

por lo que quiero ser capaz de hacer lo siguiente:

ClassA newObject = myObjects.ElementAtOrDefault(3); 

Y tienen newObject ser un tipo predeterminado de claseA que defino en alguna parte. Pensé que podría haber un SetDefaultElement u otro método, pero no creo que exista.

¿Alguna idea?

Respuesta

18

Sólo tiene que escribir su propio método de extensión:

static T ElementAtOrDefault<T>(this IList<T> list, int index, T @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default; 
} 

y llame:

var item = myObjects.ElementAtOrDefault(3, defaultItem); 

O si lo desea el valor por defecto para ser evaluados con pereza, use un Func<T> para el valor por defecto:

static T ElementAtOrDefault<T>(this IList<T> list, int index, 
    Func<T> @default) 
{ 
    return index >= 0 && index < list.Count ? list[index] : @default(); 
} 

Este formulario, por ejemplo, le permitiría usar un elemento predefinido (el primero, por ejemplo):

var item = myObjects.ElementAtOrDefault(3, myObjects.First); 

o más flexible:

var item = myObjects.ElementAtOrDefault(3,() => myObjects[2]); 

o

var item = myObjects.ElementAtOrDefault(3,() => new MyObject {...}); 
+0

Una sobrecarga apropiada podría volver predeterminado (T) como en la puesta en práctica de LINQ. – user7116

+1

@sixlettervariables - pero eso ya existe en el operador LINQ estándar no sobrecargado ... –

+0

Realmente me pregunto por qué ya no es parte del framework. Es trivial, pero no quiero agregar clases de extensión a proyectos heredados solo por esta sobrecarga. –

Cuestiones relacionadas