Шарпы, файлы...

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by CodeSender:), 22 Jan 2011.

  1. CodeSender:)

    CodeSender:) Active Member

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Собсна нужно подгружать из .txt кое-какие данные в программу.Для этого я написал метод который грузит по 1к строк в массивы (1к для того чтоб не забить всю ram):

    PHP:
     private List<ListMassiveLoadPhoneNums(StreamReader fileReader)
            {
                List<
    ListMassiveaccountsList = new List<ListMassive>();

                
    string line;
                for (
    int i 01000i++)
                {
                    if ((
    line fileReader.ReadLine()) != null)
                    {
                        if (
    line.Length == 10)
                        {
                            
    ListMassive listMassive = new ListMassive();
                            
    listMassive.oneMassive line.Substring(03);
                            
    listMassive.twoMassive line.Substring(3);
                            
    accountsList.Add(listMassive);
                        }
                    }
                    else
                        break;
                }
                return 
    accountsList;
            }
    PHP:
        public class ListMassive
        
    {
            public 
    string oneMassive;
            public 
    string twoMassive;
        }
    Ну и вопрос - мб можно придумать что-то проще?Сама реализация мне не нравится...
     
  2. Bers

    Bers Member

    Joined:
    17 May 2010
    Messages:
    78
    Likes Received:
    30
    Reputations:
    26
    Ограничение по памяти суперское. У тебя максимум 1000 объектов, в каждом из которых по 10 символов. Это 20кб полезных данных! Для сравнения - типичный размер нулевого поколения кучи - порядка сотен килобайт. Ограничил бы миллионом - я бы еще понял.

    Почему не используешь предвыделение списка? Он у тебя имеет гарантированный размер <= 1000 записей, причем на более-менее крупном файле большинство создаваемых списков будет иметь размер 1000
    Твои условные конструкции меня напрягают. Они какие-то... хм... неесстестсвенные

    А от такого разбора строки у меня шерсть дыбом встает. Хоть бы регулярку впихнул простейшую или руками разобрал, делов то...

    Класс с публичными не-readonly полями, как это мило...

    Тебе она просто не нравится, а я чуть не обосрался.


    А сделать надо было всего ничего - написать эту функцию как итератор. Тут же уходят и проблемы с памятью, и со всякими ненужнмыми промежуточными списками, про возможность юзать на таклом итераторе линк-запросы я вообще молчу.

    PHP:
    public IEnumerable<PairReadFile(StreamReader reader)
    {
       
    string line;
       while( (
    line reader.ReadLine()) != null)
       {
          yield return 
    Pair.Parse(line);
       }
    }

    public class 
    Pair
    {
      public 
    string Item1 getset; }
      public 
    string Item2 getset; }

      public static 
    Pair Parse(string str)
      { 
        var 
    match Regex.Match("..."str);
        return new 
    Pair
        
    {
          
    Item1 match.Groups["g1"].Value,
          
    Item2 match.Groups["g2"].Value 
        
    };
      }
    }

    ВСЕ!
     
    2 people like this.