Необходимо попробовать Блок проверки допустимости HTML (расширение Firefox). Это определенно скажет Вам, что страница имеет дублирующиеся идентификаторы и многое другое.
Это должно помочь.
Это не LINQ, и он не сильно отличается от ваших вложенных циклов for
, только немного менее подробный.
changes.ForEach(x => Array.Clear(x, 0, x.Length));
Там безусловно, способы (ab) использовать LINQ для достижения тех же результатов, но я бы счел их грязными хаками. Кроме того, эквивалент LINQ, вероятно, не будет менее подробным, чем мой пример выше.
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());
Интересный вопрос, но Linq касается запросов , и то, что вы здесь делаете, не очень похоже на запрос ко мне. Даже если есть решение, я не уверен, что буду использовать Linq для чего-то вроде этого.
Можете ли вы описать некоторые варианты использования того, как вы предлагаете использовать указанный делегат?
Я имею в виду, если PopulateChanges () возвращает вам List <> массивов DateTime, и вы пройдя их все и установив для них DateTime.MinValue, какой именно блок кода вы хотите поместить в делегат?
Всегда есть лучшие практики и тому подобное, но я не знаю, согласен ли я со всем, что все говорят ...
Если я правильно вас понимаю, вы должны перечислить свой вложенный массив по разным причинам и хотел бы инкапсулировать эту функциональность для повторного использования .. Есть несколько разных способов, но вот один с использованием 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)
{
}
это будет использоваться для действий, выполняемых с каждой датой и временем, в отличие от действий, выполняемых с каждой датой и временем ... Это будет немного отличаться.