Выражение Linq для устанавливания всех значений массива к данному значению

Необходимо попробовать Блок проверки допустимости HTML (расширение Firefox). Это определенно скажет Вам, что страница имеет дублирующиеся идентификаторы и многое другое.

11
задан Erik Funkenbusch 11 September 2009 в 21:55
поделиться

5 ответов

Это должно помочь.

Это не LINQ, и он не сильно отличается от ваших вложенных циклов for , только немного менее подробный.

changes.ForEach(x => Array.Clear(x, 0, x.Length));

Там безусловно, способы (ab) использовать LINQ для достижения тех же результатов, но я бы счел их грязными хаками. Кроме того, эквивалент LINQ, вероятно, не будет менее подробным, чем мой пример выше.

14
ответ дан 3 December 2019 в 06:46
поделиться

LINQ на самом деле не предназначен для использования для обновления коллекций. Речь идет о запросах, то есть о создании перечислимых элементов над существующими коллекциями. Я думаю, что ваш код отлично читается и не сильно улучшится, если вы заставите его использовать много лямбда-выражений и т. Д.

Если вы хотите создать новый List с каждым элементом установить значение, вы можете сделать это:

var changes = Enumerable.Range(0, width)
                        .Select(x => Enumerable.Range(0, height)
                                               .Select(y => DateTime.MinValue)
                                               .ToArray())
                        .ToList();

Если вы действительно хотите сделать это с помощью ForEach / LINQ, можно злоупотребить Выберите (но Я не рекомендую):

changes.ForEach(array => array.Select((dt, i) => array[i] = DateTime.Now)
                              .LastOrDefault());
2
ответ дан 3 December 2019 в 06:46
поделиться

Интересный вопрос, но Linq касается запросов , и то, что вы здесь делаете, не очень похоже на запрос ко мне. Даже если есть решение, я не уверен, что буду использовать Linq для чего-то вроде этого.

2
ответ дан 3 December 2019 в 06:46
поделиться

Можете ли вы описать некоторые варианты использования того, как вы предлагаете использовать указанный делегат?

Я имею в виду, если PopulateChanges () возвращает вам List <> массивов DateTime, и вы пройдя их все и установив для них DateTime.MinValue, какой именно блок кода вы хотите поместить в делегат?

0
ответ дан 3 December 2019 в 06:46
поделиться

Всегда есть лучшие практики и тому подобное, но я не знаю, согласен ли я со всем, что все говорят ...

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

List<DateTime[]> changes = new List<DateTime[]>();
changes = PopulateChanges();

// *** As pointed out ForEach this will not change the value in the array, Thanks!***
changes.ForEach(change => change.ToList().ForEach(date => date = DateTime.MinValue));

// this how ever works but is kind of confusing...
changes = changes.Select(change => change.Select(date => DateTime.MinValue).ToArray()).ToList();
//Even that would get old writing it over and over again...

Я бы сделал это таким образом ...

private void ForEachOnNestedDates(List<DateTime[]> list, Func<DateTime, DateTime> method)
{
   // Use your code...
   for (int i = 0; i < list.Count; i++)
   {
      for(int j = 0; j < list[i].Length; j++)
      {
          list[i][j] = method.Invoke(list[i][j]);
      }
   }
}

это позволит вам повторно использовать это и делать разные вещи с каждым элементом. например

//Add a Day to each datetime value
ForEachOnNestedDates(changes, (DateTime date) => date.AddDays(1));

//You also make it even more readable
ForEachOnNextedDates(changes, DoSomethingWithDate);

private DateTime DoSomethingWithDate(DateTime value)
{

}

это будет использоваться для действий, выполняемых с каждой датой и временем, в отличие от действий, выполняемых с каждой датой и временем ... Это будет немного отличаться.

0
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

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