nombre - obtener valor de un atributo xml c#
¿Me estoy perdiendo algo sobre LINQ? (6)
Me parece que me falta algo sobre LINQ. Para mí, parece que está tomando algunos de los elementos de SQL que menos me gustan y los mueve al lenguaje C # y los usa para otras cosas.
Quiero decir, pude ver el beneficio de usar declaraciones similares a SQL en cosas que no sean bases de datos. Pero si quería escribir SQL, ¿por qué no simplemente escribir SQL y mantenerlo fuera de C #? ¿Que me estoy perdiendo aqui?
El punto es que LINQ integra sus consultas en su lenguaje de programación principal, lo que le permite a su IDE proporcionarle algunas funciones (por ejemplo, soporte de Intellisense y depuración) que de otra manera no tendría, y permitir que el compilador verifique su SQL código (que es imposible con una consulta de cadena normal).
Entonces, realmente, el gran problema con LINQ no tiene nada que ver con Linq to SQL. Se trata de las mejoras que trajo al lenguaje C # en sí.
LINQ no es solo un sistema ORM, ya que Jonathan señaló que trae muchos elementos de programación funcional a C #. Y le permite hacer muchas cosas de "base de datos" en el código C # normal. Es difícil explicar cuán increíblemente poderosa puede ser. Considere cuánto ha incluido estructuras de datos genéricas sólidas y bien diseñadas (como lista, pila, diccionario / hash, etc.) en marcos comunes ha mejorado el estado de desarrollo en los idiomas modernos. Precisamente porque el uso de estas estructuras de datos es muy común y la reducción de la carga intelectual de su uso es un gran beneficio. LINQ no hace nada que no pueda hacer usted mismo, pero hace que muchas operaciones sean mucho más sencillas y mucho más fáciles.
Considere el ejemplo consagrado de eliminar duplicados de una lista no ordenada. En un lenguaje de nivel inferior como C o C ++, probablemente tendrías que ordenar la lista y mantener dos índices en la lista a medida que eliminaras los engaños. En un lenguaje con hash (Java, C #, Javascript, Perl, etc.) puede crear un hash donde las claves son los valores únicos, luego extraer las claves en una nueva lista. Con LINQ puedes hacer esto:
int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };
var uniqueData = data.GroupBy(i => i).Select(g => g.Key);
LINQ no se trata de SQL. LINQ se trata de aplicar paradigmas de programación funcional en objetos.
LINQ to SQL es un ORM construido en la parte superior de la base LINQ, pero LINQ es mucho más. No uso LINQ to SQL, pero uso LINQ todo el tiempo.
Tome la tarea de encontrar la intersección de dos listas:
Antes de LINQ, esta tarea requiere escribir un foreach anidado que repite la lista pequeña una vez para cada elemento en la lista grande O (N * M), y toma alrededor de 10 líneas de código.
foreach (int number in list1)
{
foreach (int number2 in list2)
{
if (number2 == number)
{
returnList.add(number2);
}
}
}
Usando LINQ, hace lo mismo en una línea de código:
var results = list1.Intersect(list2);
Notarás que no se parece a LINQ, pero sí lo es. No necesita usar la sintaxis de expresión si no desea.
Debido a que linq es realmente mónadas en ropa sql, lo estoy usando en un proyecto para hacer solicitudes web asíncronas con la mónada de continuación, ¡y está probando que funciona muy bien!
Consulte estos artículos: http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/ 11 / las-maravillas-de-monadas.aspx
Desde el primer artículo:
var requests = new[]
{
WebRequest.Create("http://www.google.com/"),
WebRequest.Create("http://www.yahoo.com/"),
WebRequest.Create("http://channel9.msdn.com/")
};
var pages = from request in requests
select
from response in request.GetResponseAsync()
let stream = response.GetResponseStream()
from html in stream.ReadToEndAsync()
select new { html, response };
foreach (var page in pages)
{
page(d =>
{
Console.WriteLine(d.response.ResponseUri.ToString());
Console.WriteLine(d.html.Substring(0, 40));
Console.WriteLine();
});
}
Antes de:
// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];
Stream l_ImageStream = null;
Bitmap l_Bitmap = null;
// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();
// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();
foreach (string l_Str in l_ResourceName)
{
if (l_Str.EndsWith(".png"))
{
// attach to stream to the resource in the manifest
l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
if (!(null == l_ImageStream))
{
// create a new bitmap from this stream and
// add it to the arraylist
l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
if (!(null == l_Bitmap))
{
int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
l_Index -= 1;
if (l_Index < 0) l_Index = 0;
if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
m_ImageArray[l_Index] = l_Bitmap;
}
l_Bitmap = null;
l_ImageStream.Close();
l_ImageStream = null;
} // if
} // if
} // foreach
Después:
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
.Where(a => a.EndsWith(".png"))
.OrderBy(b => b)
.Select(c => l_Assembly.GetManifestResourceStream(c))
.Where(d => d != null) //ImageStream not null
.Select(e => Bitmap.FromStream(e))
.Where(f => f != null) //Bitmap not null
.ToList();
O, alternativamente ( sintaxis de consulta ):
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = (
from resource in l_Assembly.GetManifestResourceNames()
where resource.EndsWith(".png")
orderby resource
let imageStream = l_Assembly.GetManifestResourceStream(resource)
where imageStream != null
let bitmap = Bitmap.FromStream(imageStream)
where bitmap != null)
.ToList();