Скорость отработки запросов на LINQ существенно (в разы) ниже, чем прямой перебор коллекций, однако мы, разработчики, внедряем всякие умные Parallel LINQ или начинаем заниматься разделением потоков вместо того, чтобы не писать LINQ-запрос, а просто перебрать коллекцию
однако там даже ORM-подхода нет
код на LINQ и прочих “упростителях жизни” проще тестировать
Один pm целый день у меня расспрашивал за сколько я сделаю ту или иную задачу
один из них начал названивать по телефону ко мне на выходных, и интересоваться как дела с задачей так как дедлайн кончился и с него спрашивает заказчик
TooLongNameException
и NegativePriceException
где-то выше станут ModelValidationException
, т.е. там вам достаточно знать, что модель кривая, вне зависимости от того, по какой причине это произошло.is_...
(но не isnot_...
)parse_html()
, то внутри него вместо html_nodes
можно писать просто nodes
. ArrayList
без весомой на то необходимости. Поэтому компилятор не смог вас предупредить, что ArrayList
состоит из ArrayList
'ов, в котором строки (двумерный массив строк), а не просто строк.ArrayList
необходимо использовать типизированный динамический массивList<string>
.public void Click_OpenFile()
{
string fileName = form1.OpenFie();
IList<string[]> aL = ParseFile(fileName);
foreach (var line in aL)
{
// Снова собираем токены в строки
MessageBox.Show(string.Join(" ", line));
}
}
// Читаем файл и построчно парсим его
private IList<string[]> ParseFile(string fileName)
{
if (string.IsNullOrEmpty(fileName))
{
throw new ArgumentNullException(nameof(fileName));
}
if (!File.Exists(fileName))
{
throw new ArgumentException($"There is no file {fileName}!");
}
string[] fileContent = File.ReadAllLines(result);
var aL = new List<string[]>(fileContent.Length);
foreach (var line in fileContent)
{
aL.Add(ParseString(line));
}
return aL;
}
// Разбиваем строки на токены
private string[] ParseString(string s)
{
const char delimiter = '|';
return s.Split(delimiter);
}
hp
типа int
, его адрес совпадает с базовым. Он занимает sizeof(int)
байт. То есть color
находится по адресу базовый адрес + sizeof(int)
. Следующий член idCar
находится по адресу базовый адрес + sizeof(int) + sizeof(string)
и так далее. Но на это полагаться опасно, т.к. существует такое понятие, как выравнивание: часто операционные системы выравнивают данные по границе машинного слова. Т.е. если в нашей архитектуре машинное слово - 4 байта, а член структуры занимает 3 байта (char[3]
), то будет добавлено пустое пространство в 1 байт и следующий член разместится по адресу адрес char-массива + sizeof(char[3]) + 1
char*
смещается на 1 байт, int*
(при sizeof(int)
== 4) на 4 байта, к void*
адресную арифметику применять нельзя, потому что его размер нам неизвестен. A
в B
нельзя, потому что A - это не B. Потому что B
содержит какое-то дополнительное состояние (b
), которого нет в A
и компилятору неизвестно, каким оно должно быть в текущем виде (A
конструировался иначе, чем B
и как получить валидный B
из A
- известно лишь программисту). Invalid Cast
).Enumerable.OfType<T>()
- фильтрует по типу и законно возвращает пустой список (у вас список A
, там действительно нет B
)Enumerable.Cast<T>()
- последовательно делает каст, который невозможен.listA.Select(x => new B{ a = x.a }).ToList();
A
необходимые данные для конструирования объекта B
. Важно понимать, что это будут именно ДРУГИЕ объекты. Если A некопируем по своей природе, то этот фокус не пройдет. std::numeric_limits
.
1. [ Note: Clause 5 defines the syntax, order of evaluation, and meaning of expressions.60 An expression is a
sequence of operators and operands that specifies a computation. An expression can result in a value and
can cause side effects. — end note ]
....
4. If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.