none
¿Como hago para evitar que se sobrescriba los valores de un objecto en ASP.NET? RRS feed

  • Pregunta

  • Buenos días escribo en esta oportunidad porque noc como hacer para que un objeto me guarde varios objetos de tipo string pero no que sobreescriba los object string que ya le he anexado, estoy trabajando con asp.net y una función en donde debe retornar una lista de objecto, este es el código que estoy utilizado:

    List<object[]> arr = new List<object[]>();
    object[] dataObj = { };
    string[] animals2 = { };
    
    IRow headerRow = sheet.GetRow(0); //Get Header Row
    int cellCount = headerRow.LastCellNum;
    int rowCount = sheet.LastRowNum;
    Array.Resize(ref animals2, cellCount);
    Array.Resize(ref dataObj, rowCount);
    
    for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) //Read Excel File
                        {
        IRow row = sheet.GetRow(i);
        if (row == null) continue;
        if (row.Cells.All(d => d.CellType == CellType.Blank)) continue;
       for (int j = 0; j < cellCount; j++)
       {
         if (row.GetCell(j) != null)
          animals2[j]= row.GetCell(j).ToString();
         else
           animals2[j] ="";
       }
          dataObj[i] =  animals2 ;
    }
    

    el error que esta sucediendo es que dataObj si el primer objecto que le paso es 
    [0]="1"
    [1]="Ana"
    [2]="Rodriguez"

    cuando le paso el 2do objecto al dataObj me sobreescribe y me genera dos objecto con valores del ultimo.

    Como hago para evitar esto? Si me pudieran orientar se lo agradecería.

    viernes, 1 de febrero de 2019 12:53

Todas las respuestas

  • hola

    Porque programas de esa forma, no esta bueno usar object y mucho menor en arra, no se que estas iterando porque lo que veo es solo un espagueti de codigo

    animals2 s un array pero lo asignas directo cuando usas

    dataObj[i] =  animals2 ;

    eso esta raro

    deberias crar una clase como ser

    public class Class1{
    
        public int Nro {get;set}
    
        public string Nombre {get;set}
    
        public string Apellido {get;set}
    
    }


    entonces defines

    List<Class1> dataObj = new List<dataObj>();

    puedes usar el dataObj .Add() para agregar nuevos items a la lista

    pero estarias programando orientado a objetos, dejando el codigo mucho mas prolijo

    no uses array y menos aun object, son pesimas practicas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 1 de febrero de 2019 13:25
  • Gracias por responderme, quisiera hacer una clase que se pueda reutilizar, es que tengo un método para importar datos de excel pero quiero que retorne las filas para poder trabajar en otro método y alli si puedo colocar condiciones, como podría hacer? este es código que estoy utilizando

    public List<Plandecuenta> OnPostImport(IFormFile file)
            {
                List<Plandecuenta> data = new List<Plandecuenta>();
                List<object[]> arr = new List<object[]>();
                object json= "";
                object[] dataObj = { };
                string[] animals2 = { };
                string[] animals3 = new string[0];
    
                string folderName = "Upload";
                string webRootPath = _hostingEnvironment.WebRootPath;
                string newPath = Path.Combine(webRootPath, folderName);
                if (!Directory.Exists(newPath))
                {
                    Directory.CreateDirectory(newPath);
                }
                if (file.Length > 0)
                {
                    string sFileExtension = Path.GetExtension(file.FileName).ToLower();
                    ISheet sheet;
                    string fullPath = Path.Combine(newPath, file.FileName);
                    using (var stream = new FileStream(fullPath, FileMode.Create))
                    {
                        file.CopyTo(stream);
                        stream.Position = 0;
                        if (sFileExtension == ".xls")
                        {
                            HSSFWorkbook hssfwb = new HSSFWorkbook(stream); //This will read the Excel 97-2000 formats  
                            sheet = hssfwb.GetSheetAt(0); //get first sheet from workbook  
                        }
                        else
                        {
                            XSSFWorkbook hssfwb = new XSSFWorkbook(stream); //This will read 2007 Excel format  
                            sheet = hssfwb.GetSheetAt(0); //get first sheet from workbook   
                        }
                        IRow headerRow = sheet.GetRow(0); //Get Header Row
                        int cellCount = headerRow.LastCellNum;
                        int rowCount = sheet.LastRowNum;
                        Array.Resize(ref animals2, cellCount);
                        Array.Resize(ref dataObj, rowCount);
                        for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) //Read Excel File
                        {
                            IRow row = sheet.GetRow(i);
                            if (row == null) continue;
                            for (int j = 0; j < cellCount; j++)
                            {
                                if (row.GetCell(j) != null) { 
                                    animals2[j] = row.GetCell(j).ToString();
                            }else
                                    animals2[j] ="";
                            }
                        }
                    }
                }
                arr.Add(dataObj);
                return arr;
            }
    como puedo hacer para retornar solo las filas? si me pudiera dar una idea te lo agradecería


    • Editado TeresaAgui viernes, 1 de febrero de 2019 13:59 falto agregar un detalle
    viernes, 1 de febrero de 2019 13:58
  • >>tengo un método para importar datos de excel pero quiero que retorne las filas para poder trabajar en otro método y alli si puedo colocar condiciones, como podría hacer?

    no entiendo como accedes al excel, pero me parece que la libreria XSSFWorkbookesta un poco rara la forma como iteras los datos

    se supone que si defines una clase debas poder asignar las propiedades que mapean con cada columna

    List<Class1> dataObj = new List<Class1>();
    
    for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++){
    
        IRow row = sheet.GetRow(i);
    
         Class1 item = new Class1();
         item.Nro =  Convert.ToInt32(row.GetCell(0));
         item.Nombre = row.GetCell(1).ToString();
         item.Apellido= row.GetCell(2).ToString();
    
        dataObj.Add(item);
    
    }
    

    la idea es que teniendo la row puedas recuperar y mapear a las propiedades de cada celda

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 1 de febrero de 2019 14:58