2012-06-17 13 views
7

Quiero agregar soporte LINQ a mi analizador Apple Property List (Lista de propiedades) (binario, JSON y XML) para que pueda usar SQL como consultas en él como pueda con System.Xml. Funciona al analizar el archivo por completo y guardarlo en el montón. (como System.Xml hace).Agregando LINQ a mis clases

He estado buscando en Google y parece que no entiendo nada de eso (obtengo muchas páginas de Using LINQ to SQL Classes). La guía sobre MSDN, tampoco entiendo. ¿Que necesito hacer?

Respuesta

17

La implementación de LINQ simplemente significa la aplicación de los métodos de LINQ espera estar allí, como Where o Select, con las firmas correctas. A pesar de la percepción común, no es necesario implementar la interfaz IEnumerable para su clase para admitir LINQ. Sin embargo, implementando IEnumerableautomáticamente obtendrá el conjunto completo de métodos LINQ en la clase Enumerable casi gratis - usted solo tiene que implementar GetEnumerator y una clase IEnumerator.

Hay un par de ejemplos sobre cómo implementar IEnumerable en mi blog, en esta publicación acerca de the Iterator pattern.

Sin embargo, si no tiene sentido que su clase sea enumerable, no es necesario que lo haga. Solo necesita implementar los métodos LINQ apropiados directamente. A LINQ no le importa cómo se definan los métodos, siempre que compile C#. Es decir, si se escribe:

from p in myPlist where p.Thing == "Thing" select p; 

el compilador de C# esto se traduce en:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p); 

Mientras que recopila, LINQ funcionará. Para ver las firmas correctas para los métodos, busque como la documentación de MSDN list of LINQ query methods. Por ejemplo (se supone que su PList era una lista de PListItem s):

public class PList 
{ 
    public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate) 
    { 
    foreach (var item in this.items) 
    { 
     if (predicate(item)) 
     { 
     yield return item; 
     } 
    } 
    } 
} 

bien la aplicación de LINQ directamente de esta manera le da mucho más control sobre cómo se comporta, es un mucho trabajo más para conseguirlo correcto, y necesita comprender las implicaciones de sus valores devueltos, y encadenar llamadas LINQ, etc. En general, si puede salirse con la suya implementando IEnumerable y dejar que C# haga todo el trabajo por usted, las cosas son mucho más fáciles.

+2

por cierto, buena publicación en el blog! –

1

Debe implementar IEnumerable primero. leído que primero - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

+0

¿implementar como heredar? –

+0

En С # debes declararlo como herencia e implementar todos los miembros, definidos en la interfaz. P. ej.si tiene interfaz _IBoostable_ que contiene método con la descripción Boost _void (int multiplicador); _, debe escribir algo así 'class MiClase: IBoostable { public void Boost (int multiplicador) { doSomething (multiplicador); } } ' –

Cuestiones relacionadas