Скорость отработки запросов на 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]) + 1char* смещается на 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 некопируем по своей природе, то этот фокус не пройдет. не хочется завязываться на конкретного вендора, который когда захочет меняет свои технологии