optimizar codigo foreach

Iniciado por aspiazu, 8 Abril 2017, 11:09 AM

0 Miembros y 1 Visitante están viendo este tema.

aspiazu

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 (csharp) [Seleccionar]
foreach (var juego in data.Juegos) {
   }
   //creamos los botones por cada carpeta que tengamos en Apps
   if (Directory.Exists(rutasapp)) {
       foreach (string dataApp in Directory.GetDirectories(rutasapp)) {
           GameObject button = Instantiate(buttonPrefab) as GameObject;
           button.transform.SetParent(layout);
           button.name = "Button" + layout.childCount;
           //buscamos todos los ficheos que sean .exe y los guardamos en data

           foreach (string data in Directory.GetFiles(@dataApp)) {
               if (Path.GetExtension(@data) == ".exe") {
                   //al clicar el boton ejecutamos el exe que hemos guardado anteriormente .NO FUNCIONA
                   button.GetComponent<Button>().onClick.AddListener(() => Process.Start(data));
                   UnityEngine.Debug.Log(data);

               }

               //buscamos todas las imagenes que sean .png y las guardamos en imagenes
               foreach (string imagenes in Directory.GetFiles(@dataApp)) {
                   if (Path.GetExtension(@imagenes) == ".png") {
                        string imgPath = imagenes;
                           //si no exite nos muestra el mensaje de error
                           if (!File.Exists(imgPath)) {
                               UnityEngine.Debug.LogError("File doesn't exist: " + imgPath);
                               return;
                           }

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.


engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#4
Cita de: aspiazu en  8 Abril 2017, 11:09 AMcomo 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 (csharp) [Seleccionar]
DirectoryInfo dir = new DirectoryInfo(@"C:\Directory\");
IEnumerable<FileInfo> files =
   from file in dir.EnumerateFiles("*.*", SearchOption.AllDirectories)
   where new string[] { ".png", ".jpg" }.Contains(file.Extension, StringComparer.OrdinalIgnoreCase)
   select file;

foreach (FileInfo file in files) {
   Console.WriteLine(file.FullName);
}


En el caso contrario:
Código (csharp) [Seleccionar]
DirectoryInfo dir = new DirectoryInfo(@"C:\Directory\");
FileInfo[] files =
    Array.FindAll(dir.GetFiles("*.*", SearchOption.AllDirectories),
                  file => new string[] { ".png",".jpg" }.Contains(file.Extension, StringComparer.OrdinalIgnoreCase));

foreach (FileInfo file in files) {
   Console.WriteLine(file.FullName);
}


¡Saludos!








Serapis

Cita de: 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?


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:
Citarif (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

aspiazu

Gracias usando using System.Linq; lo hice.

Echare un vistazo a lo que puso el compi NEBIRE