Когда у вас есть объект, вы можете указать функцию-заменитель для разделения каждой пары ключ-значение с помощью новой строки, затем использовать регулярное выражение для обрезания начальных пробелов, а затем использовать другое регулярное выражение для вставки пробела перед [112 ] пары ключ-значение. Затем просто запишите отформатированную строку в файл:
const obj = {"a":"1", "b":"2"};
const stringToWrite = JSON.stringify(obj, null, ' ')
// Trim leading spaces:
.replace(/^ +/gm, '')
// Add a space after every key, before the `:`:
.replace(/: "(?:[^"]+|\\")*",?$/gm, ' [110]amp;');
console.log(stringToWrite);
Хотя вы можете найти начальные пробелы более читабельными: [ 119]
const obj = {"a":"1", "b":"2"};
const stringToWrite = JSON.stringify(obj, null, ' ')
// Add a space after every key, before the `:`:
.replace(/: "(?:[^"]+|\\")*",?$/gm, ' [111]amp;');
console.log(stringToWrite);
Вы совершенно правы, он может выполнить итерации по списку, можно думать о коде в вопросе, как являющемся концептуально тем же как следующее:
private static Post GetPost(Guid id)
{
Post p = default(Post);
foreach (Post post in _Posts)
{
if (post.Id == id)
{
p = post;
break;
}
}
return p;
}
Это требует, чтобы меньше кода записало Ваш отрывок, и значительно Вы теперь говорите, чем Вы хотите быть найденными и не точно, как найти его:
private static Post GetPost(Guid id)
{
return _Posts.Find(delegate(Post p)
{
return p.Id == id;
});
}
В C# 3.0 это может быть сокращено дальнейшее использование, что называют "лямбда-выражением" к:
private static Post NewGetPost(Guid id)
{
return _Posts.Find(p => p.Id == id);
}
Используя наименьшее количество объема читаемого кода для достижения той же цели делает и устройства записи и средства чтения того кода более счастливыми.
Если Вы используете C# 3.0, или позже можно использовать Linq для нахождения объектов быстро в Списке.
public static Post GetPost(Guid id)
{
return (from p in _Posts
where p.Id == id
select p).First();
}
Он использует анонимного делегата. Он, возможно, использовал лямбда-выражение вместо этого:
Posts.Find(p => p.Id == id)
Кроме того, обертывание доступа к списку в методе ничего не достигает в этом случае и выставляет элементы списка внешним вызывающим абонентам. Это - плохая практика.
Predicate<T>
. Это - по существу ярлык так, чтобы Вы не выполняли итерации по списку. List<T>.Find(Predicate<T>)
мог бы также иметь некоторую встроенную оптимизацию.delegateInstance(arg1,arg2);
Список. Найдите (Соответствие предиката) не дополнительный метод LINQ, потому что этот метод был в платформе с тех пор 2.0, как обозначается MSDN. Во-вторых, нет, ничто неправильно с использованием Не Находит (). Это имеет тенденцию быть более читаемым, чем его альтернативы:
Классик:
public static Post GetPost(Guid id)
{
bool found = false;
foreach(post in _Posts)
{
if post.Id == id return post;
}
return default(Post);
}
LINQ:
public static Post GetPost(Guid id)
{
var post = (
from p in _Posts
where p.Id = id
select p
).FirstOrDefault();
}
Использование Списка. Найдите (), говорит Вам сразу, что Вы, ищут объект, в то время как другой необходимо следовать за логикой для установления этого. Найдите (), в основном инкапсулирует повторение по элементам списка. Если у Вас был метод на классе Сообщения как public bool HasId(Guid id)
затем Вы могли записать
_Post.Find(post.HasId(id));