// retornar los elementos que pertenezcan a la categoria de PythonvoidChallenge_5(IEnumerable<Book> books){// extension method//var result = books.Where(b => b.Categories.Contains("Python"));// query expressionvar result =from b in books where b.Categories.Contains("Python") select b;PrintValues(result);}
Operador Contains
Se usa para encontrar los registros que contienen un determinado string.
//Query expression (experiment)returnfrom book in booksCollection where book.Categories.Contains("Python") select book;
publicIEnumerable<Book>containsPython(){returnfrom p in librosCollection where p.Categories.Contains("Python") select p;}``` public*IEnumerable*\<Book>containsPython(){returnfrom p in librosCollection where p.Categories.Contains("Python") select p;}
nice
El código que propone el profe es KeySensitive por lo cual no encontraría libros para "python".
Para evitar la detección de mayúsculas y minúsculas se puede añadir un argumento al llamar el método Contains(), así:
publicIEnumerable<Book>LibrosPorCategoria(string method, string categoria){if(method is "method"){return _booksCollection.Where(x=> x.Categories.Contains(categoria,StringComparer.CurrentCultureIgnoreCase));}elseif(method is "query"){returnfrom b in _booksCollection
where b.Categories.Contains(categoria,StringComparer.CurrentCultureIgnoreCase) select b;}else{returnEnumerable.Empty<Book>();}}
Porque en los arrays el termino tiene que ser exacto y en las variables no?
Por ejemplo, al intentar buscar con Contains("Pyt") en el titulo me retorna la lista, pero al intentarlo con el array, es decir la subcategoria con una lista, no me retorna nada.
Porque en los arrays busca el valor que es igual a "Pyt". Mientras que en el título busca la subcadena "Pyt". El título es de tipo string y categories un arreglo de strings.
Un saludo a todos,
¿Cómo sería una consulta donde no sabemos si la palabra que está buscando dentro del arreglo se encuentra en mayúsculas o minúsculas?
Puedes utilizar los operadores de ToLower o ToUpper para transformar todo en mayusculas o minusculas y poder comprar los textos
Utilizando Method Expresion:
public IEnumerable<Book> CategoriesContainBook()
{
//Extension method
return BooksCollections.Where(p => p.Categories.Contains("Python"));
//Query Expression
var query = from p in BooksCollections
where(p.Categories.Contains("Python"))
select p;
return query;
}
Si quieren poder imprimir las categorías pueden usar esta forma, les imprimira los valores del array de categorias.
ImprimirValores(queries.CategoriaPython());voidImprimirValores(IEnumerable<Book> listdelibros){ System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 17}\n","Titulo","N. Paginas","Fecha publicacion","Categoria");//los valores de entre {} nos permiten decir le al sistema que queremos que se impriman de una parte hasta otra System.Console.WriteLine(new string('-',90));foreach(var item in listdelibros){ string categoria = string.Join(", ", item.Categories); System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 24} ", item.Title, item.PageCount, item.PublishedDate.ToShortDateString(), categoria);}}```ImprimirValores(queries.CategoriaPython());voidImprimirValores(IEnumerable\<Book> listdelibros){ System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 17}\n","Titulo","N. Paginas","Fecha publicacion","Categoria");//los valores de entre {} nos permiten decir le al sistema que queremos que se impriman de una parte hasta otra System.Console.WriteLine(new string('-', 90)); foreach (var item in listdelibros) { string categoria = string.Join(", ", item.Categories); System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 24} ", item.Title, item.PageCount, item.PublishedDate.ToShortDateString(), categoria); } }
Si quieren poder imprimir las categorías pueden usar esta forma, les imprimira los valores del array de categorias
ImprimirValores(queries.CategoriaPython());
void ImprimirValores(IEnumerable<Book> listdelibros){ System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 17}\n", "Titulo", "N. Paginas", "Fecha publicacion", "Categoria"); //los valores de entre {} nos permiten decir le al sistema que queremos que se impriman de una parte hasta otra System.Console.WriteLine(new string('-', 90)); foreach (var item in listdelibros) { string categoria = string.Join(", ", item.Categories); System.Console.WriteLine("{0, -60} {1, 15} {2, 11} {3, 24} ", item.Title, item.PageCount, item.PublishedDate.ToShortDateString(), categoria); } }
Mi solucion para poder buscar en mayusculas y minusculas
//Primer desafio con metodo Contains:public IEnumerable<Book>BooksWithCategoryPython(){return CollectionBooks.Where(p => p.Categories.Contains("Python"));}
Buscando en internet y con el linter de c# me dice que debo usar otros metodos en vez de All y any, estos son los que me recomendaba en .net 7:
public bool AllBooksHasStatus(){//extension methodreturnCollectionBook.TrueForAll(book=> book.Status!=null);//linq query// return (from book in CollectionBook where book.Status != null select book).Count() == CollectionBook.Count;}public bool AnyBookHasBeenPublishByYear(int year){//extension methodreturnCollectionBook.Exists(book=> book.PublishedDate.Year== year);//linq query// return (from book in CollectionBook where book.PublishedDate.Year == year select book).Any();}
No quememos el valor, hagamos que sea escalable nuestra función: