Authorize
.app.UseCookieAuthentication(new CookieAuthenticationOptions());
JValue
, у вас в одном из случаев data
становится не объектом со вложенными свойствами, а примитивным типом (например, числом или строкой).data["count"] != null
поставьте проверку на data is JObject
. var random = new Random();
// размеры массива, в качестве примера взяты константы
var columns = 10;
var rows = 5;
// создаем данные
var data = new int[rows][];
for(var row = 0; row < rows; row++)
{
data[row] = new int[columns];
for(var column = 0; column < columns; column++)
data[row][column] = random.NextInt(-100, 100);
}
// сортируем данные
var sorted = data.OrderBy(x => x.Sum()).ToArray();
int?
на int
и уберете первую проверку, приложение будет работать точно так же, но обработка ошибок будет проводиться автоматически средствами фреймворка. Он будет искать метод с подходящей сигнатурой, не найдет его и выдаст стандартное сообщение об ошибке.id
для логики не важно - это сделано, чтобы нагляднее показать, как можно обрабатывать ошибки вручную. Console
, приходится мириться с его ограничениями, в частности - однопоточностью.ConsoleWrapper
и тестовый ConsoleWrapperMock
._inner
используется у вас во многих местах, и есть некий публичный метод, который его возвращает. Тогда внешний код сможет вызвать этот метод, получить тот же экземпляр объекта _inner
и поставить на него свой lock
. Так можно случайно словить взаимоблокировку и повесить приложение._lock
- это просто правило хорошего тона, его создают для безопасности: очень маловероятно, что кому-то придет в голову использовать его за пределами инструкции lock
и тем более вернуть из метода.foreach
, создается новый перечислитель. Поэтому сбрасывать состояние не надо. Вы же сделали химеру из коллекции и ее собственного перечислителя (return this as IEnumerator
), поэтому вам приходится сбрасывать состояние руками.List<T>
, Dictionary<TKey, TValue>
и множество других, которые следует использовать. Html.BeginForm
и т.д.) по умолчанию не задают элементам классы, которые принято использовать в Bootstrap. Поэтому у каждого метода есть версия, которая принимает анонимный объект с атрибутами. Например, так:@Html.TextBoxFor(x => x.MyField, new { @class = "form-control" })
class AbstractExpressionList<T>: Dictionary<string, Func<T, T>> { }
public T Aggregate(IEnumerable<T> values, T accumulator, Func<T, T> projection)
{
var current = accumulator;
foreach(var value in values)
current = projection(current, value);
return current;
}
var data = new AbstractExpressionList<T>
{
["a"] = ...,
["b"] = ...
};
var result = data.Aggregate(...);
GetHashCode
и Equals
нужно переопределять, если вы хотите, чтобы два различных экземпляра одного класса могли считаться одинаковыми. В вашем же случае экземпляр будет равен только самому себе, потому что Id
всегда будут уникальными. Получается, вы переизобрели семантику сравнения по ссылке, которая и так работает по умолчанию, если не переопределять GetHashCode
и Equals
вообще.LastLeasedID
рано или поздно получите дубликаты.