Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: aspiazu en 8 Abril 2017, 11:09 am



Título: optimizar codigo foreach
Publicado por: aspiazu en 8 Abril 2017, 11:09 am
Buenas ! Tengo 3 foreach,uno para buscar cuantas carpetas hay en un directorio,otro para buscar los png que hay y otro para buscar los exe que hay. El problema es que para buscar cada exe y luego png doi 36 vueltas ,como puedo arreglarlo?como puedo hacer que solo busque los archivos con esas extensiones y no valla comprobando toodos los archivos? Y como puedo hacer que busque png y jpg? y lo mismo con exe y lnk?

Código
  1. foreach (var juego in data.Juegos) {
  2.    }
  3.    //creamos los botones por cada carpeta que tengamos en Apps
  4.    if (Directory.Exists(rutasapp)) {
  5.        foreach (string dataApp in Directory.GetDirectories(rutasapp)) {
  6.            GameObject button = Instantiate(buttonPrefab) as GameObject;
  7.            button.transform.SetParent(layout);
  8.            button.name = "Button" + layout.childCount;
  9.            //buscamos todos los ficheos que sean .exe y los guardamos en data
  10.  
  11.            foreach (string data in Directory.GetFiles(@dataApp)) {
  12.                if (Path.GetExtension(@data) == ".exe") {
  13.                    //al clicar el boton ejecutamos el exe que hemos guardado anteriormente .NO FUNCIONA
  14.                    button.GetComponent<Button>().onClick.AddListener(() => Process.Start(data));
  15.                    UnityEngine.Debug.Log(data);
  16.  
  17.                }
  18.  
  19.                //buscamos todas las imagenes que sean .png y las guardamos en imagenes
  20.                foreach (string imagenes in Directory.GetFiles(@dataApp)) {
  21.                    if (Path.GetExtension(@imagenes) == ".png") {
  22.                         string imgPath = imagenes;
  23.                            //si no exite nos muestra el mensaje de error
  24.                            if (!File.Exists(imgPath)) {
  25.                                UnityEngine.Debug.LogError("File doesn't exist: " + imgPath);
  26.                                return;
  27.                            }


Título: Re: optimizar codigo foreach
Publicado por: engel lex en 8 Abril 2017, 13:40 pm
esto es c++?


Título: Re: optimizar codigo foreach
Publicado por: aspiazu en 8 Abril 2017, 14:24 pm
C#


Título: Re: optimizar codigo foreach
Publicado por: engel lex en 8 Abril 2017, 14:28 pm
tema movido c# es .net


Título: Re: optimizar codigo foreach
Publicado por: Eleкtro en 8 Abril 2017, 16:58 pm
como puedo hacer que busque png y jpg? y lo mismo con exe y lnk?

En el caso de que Unity permita el uso de LINQ (.NET Framework +3.5):

Código
  1. DirectoryInfo dir = new DirectoryInfo(@"C:\Directory\");
  2. IEnumerable<FileInfo> files =
  3.    from file in dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
  4.    where new string[] { ".png", ".jpg" }.Contains(file.Extension, StringComparer.OrdinalIgnoreCase)
  5.    select file;
  6.  
  7. foreach (FileInfo file in files) {
  8.    Console.WriteLine(file.FullName);
  9. }

En el caso contrario:
Código
  1. DirectoryInfo dir = new DirectoryInfo(@"C:\Directory\");
  2. FileInfo[] files =
  3.    Array.FindAll(dir.GetFiles("*.*", SearchOption.AllDirectories),
  4.                  file => new string[] { ".png",".jpg" }.Contains(file.Extension, StringComparer.OrdinalIgnoreCase));
  5.  
  6. foreach (FileInfo file in files) {
  7.    Console.WriteLine(file.FullName);
  8. }

¡Saludos!


Título: Re: optimizar codigo foreach
Publicado por: Serapis en 8 Abril 2017, 17:00 pm
Buenas ! Tengo 3 foreach,uno para buscar cuantas carpetas hay en un directorio,otro para buscar los png que hay y otro para buscar los exe que hay. El problema es que para buscar cada exe y luego png doi 36 vueltas ,como puedo arreglarlo?como puedo hacer que solo busque los archivos con esas extensiones y no valla comprobando toodos los archivos? Y como puedo hacer que busque png y jpg? y lo mismo con exe y lnk?

Código:
foreach (string data in Directory.GetFiles(@dataApp)) {
 if (Path.GetExtension(@data) == ".exe") {
...
foreach (string imagenes in Directory.GetFiles(@dataApp)) {
if (Path.GetExtension(@imagenes) == ".png") {
                     
Cuando estás en el entorno de Visual Studio, selecciona el objeto "Directory" o el método "Getfiles", y pulsa la tecla F2, para abrir el examinador de objetos...
Y si no tienes instalado en casa el MSDN, entonces recurre a internet:
https://msdn.microsoft.com/es-es/library/system.io.directory(v=vs.110).aspx
...Entonces verás que el método "Getfiles", tiene varias sobrecargas...
Una de ellas por ejemplo tiene esta firma:
public static string[] GetFiles(string path, string searchPattern}
Luego tú, lo invocarías de manera sencilla así:
foreach (string data in Directory.GetFiles(@dataApp, "*.png")) {
  ....
   haz lo que quieras con el fichero obtenido...


...pero no te quedes sólo con esa sobrecarga, debes mirar, si otra te resulta aún más útil, en base a lo que luego pretendas hacer con el fichero obtenido...
por ejemplo Esta otra sobrecarga, tiene aún una opción más para buscar de forma recursiva en subcarpetas:
public static string[] GetFiles(string path, string searchPattern, SearchOption searchOption )
(usando la opción AllDirectories)

Con lo que incluso te ahorrarías el bucle externo:
Citar
if (Directory.Exists(rutasapp)) {
        foreach (string dataApp in Directory.GetDirectories(rutasapp)) {
También tienes en el mismo objeto directory, el método EnumerateFiles....

En fin, es info que está ahí, mejor si está instalado en tu equipo, así te basta usar la tecla F2 para navegar entre los objetos y ver qué método se ajusta mejor a tus necesidades... y si no lo tienes instalado, entonces la dirección de MSDN, debería estás en tus favoritos/marcadores:
https://msdn.microsoft.com/es-es/library/
https://msdn.microsoft.com/es-es/library/ms310241


Título: Re: optimizar codigo foreach
Publicado por: aspiazu en 8 Abril 2017, 19:45 pm
Gracias usando using System.Linq; lo hice.

Echare un vistazo a lo que puso el compi NEBIRE