Анонимные Делегаты и универсальные Списки в C#

Когда у вас есть объект, вы можете указать функцию-заменитель для разделения каждой пары ключ-значение с помощью новой строки, затем использовать регулярное выражение для обрезания начальных пробелов, а затем использовать другое регулярное выражение для вставки пробела перед [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);

5
задан flesh 4 February 2009 в 21:29
поделиться

5 ответов

Вы совершенно правы, он может выполнить итерации по списку, можно думать о коде в вопросе, как являющемся концептуально тем же как следующее:

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);
}

Используя наименьшее количество объема читаемого кода для достижения той же цели делает и устройства записи и средства чтения того кода более счастливыми.

19
ответ дан 18 December 2019 в 05:40
поделиться

Если Вы используете C# 3.0, или позже можно использовать Linq для нахождения объектов быстро в Списке.

public static Post GetPost(Guid id)
{
    return (from p in _Posts
            where p.Id == id
            select p).First();
}
1
ответ дан 18 December 2019 в 05:40
поделиться

Он использует анонимного делегата. Он, возможно, использовал лямбда-выражение вместо этого:

Posts.Find(p => p.Id == id)

Кроме того, обертывание доступа к списку в методе ничего не достигает в этом случае и выставляет элементы списка внешним вызывающим абонентам. Это - плохая практика.

7
ответ дан 18 December 2019 в 05:40
поделиться
  1. Список в основном проходит каждый элемент и проверяет, возвращает ли элемент true для этого Predicate<T>. Это - по существу ярлык так, чтобы Вы не выполняли итерации по списку. List<T>.Find(Predicate<T>) мог бы также иметь некоторую встроенную оптимизацию.
  2. Вы звоните делегату, использующему синтаксис:

delegateInstance(arg1,arg2);

3
ответ дан 18 December 2019 в 05:40
поделиться

Список. Найдите (Соответствие предиката) не дополнительный метод 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));
1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: