2013-07-20 2 views
0

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

Вот что я хочу (something like this but it is not particularly critical).

var string = someMultilneString; 
var reader = new StringReader(string); 
while(true) { 
    var line = reader.readLine(); 
    if(line == null) { 
    break; 
    } 
    // work with line 
} 

Если это (or similar to this) не представляется возможным, то почему?

P.S. Также, пожалуйста, не предлагайте ответы хуже этого примера. Поскольку этот способ хорошо известен, но это плохой дизайн, всегда нужно написать собственную реализацию для поддержки общих операций ввода и вывода.

List<String> StringToLines(String text) { 
    var source = text.replaceAll('\r\n', '\n'); 
    source = source.replaceAll('\r', '\n'); 
    var lines = source.split('\n'); 
    var lenght = lines.length; 
    if(lenght > 0 && lines[lenght - 1].isEmpty) { 
    lines.length--; 
    } 

    return lines; 
} 
+0

Почему вы не хотите разделить строку на строки? Это намного проще, если вы это сделаете. – tjameson

+0

Что может быть быстрее, чем проходить через байты и проверять, когда вы нажмете LF? Возможно, если вы знаете контент, вы можете оценить позицию и, возможно, пропустить некоторые проверки. Если вы хотите, чтобы это было просто, оберните его в полезную функцию, и это будет легко на сайте-вызове :) –

+0

@KaiSellgren Я не хочу писать свой собственный новый класс, но я просто хочу использовать существующую реализацию и не могу найти ее в Dart SDK. Может быть, он отсутствует? – mezoni

ответ

3

Просто разделить строку за строкой:

String str = someMultilineString; 
str.split("\n").forEach((line) { 
    // work with line 
}); 

Это самый простой способ сделать это, и это должно быть достаточно быстро (если ваша строка не огромна). См. docs.

Если вы действительно хотите, чтобы ваши идиомы, вы можете сделать свой собственный класс:

class StringReader { 
    String str; 
    int i; 
    int start = 0; 
    StringReader(this.str); 

    String readLine() { 
     // we've exhausted the string 
     if (this.start < 0) return null; 

     String ret; 
     this.i = this.str.indexOf("\n", this.start); 
     if (this.i < 0) { 
      // this is the last line 
      ret = this.str.substring(this.start); 
     } else { 
      ret = this.str.substring(this.start, this.i); 
     } 
     // if this is the last line, start will be -1 
     this.start = this.i; 
     return ret; 
    } 
} 

var reader = new StringReader(someMultilineString); 
for (var str = reader.readLine(); str != null; str = reader.readLine()) { 
    // do something with line 
} 

Но версия split намного проще и более идиоматическая.

+0

Извините, но ваш путь не самый безопасный и не универсальный. Он не использовал Dart SDK, но предложил потратить время на написание дополнительного класса. Все, что вы предложили, я знал раньше. Я хочу просто, правильно и эффективно. – mezoni

+0

@mezoni - простой, правильный и эффективный способ является первым. Я предоставил второй совместимый API с вашим предлагаемым примером, и я также не думаю, что это имеет смысл. Почему вы не можете просто использовать 'String.split'? Для этого он был разработан. – tjameson

+0

Нет проблем. Благодаря! Но мой вопрос не об алгоритмах.Вопрос такой же, как в заголовке «Как работать в веб-приложении с многострочными строками более эффективно через Dart SDK?» – mezoni

Смежные вопросы