Я столкнулся с каким-то странным/неожиданным поведением, в котором Guid.ToString()
в выражении Linq возвращает другой результат, чем Guid.ToString()
в цикле foreach.
Что делает этот метод:
Этот метод просто берет объект, а затем создает новую модель представления из исходного объекта. Компания, с которой я работаю, решила, что Guid не будет разрешено на моделях просмотра, из-за того, что один из наших старших сериализаторов JSON имеет ошибку, в которой Guid не был правильно сериализован.
Проблема/неожиданный результат:
Во время отладки/тестирования моего метода я обнаружил, что выражение Linq, которое я создал, возвращало странный результат. При преобразовании моего Guid в его строковое представление результат автоматически заглавился. Я не верил, что это было выражение Linq вначале, но как только я преобразовал логику в цикл foreach, я получил строковое представление с нижним овалом моего Guid.
Пример кода:
Обратите внимание, что типы свойств для lookupList (ID1, ID2, ID3) являются типами Guid, а свойства в NewClass - это строка типа.
Выражение Linq:
List<NewClass> returnList = lookupList.Select(i => new NewClass {
Property1 = i.ID1.ToString(),
Property2 = i.ID2.ToString(),
Property3 = i.ID3.ToString(),
.....
}).ToList();
Возврат:
{
Property1=7081C549-64D6-458E-A693-0D2C9C47D183
Property2=06DD6A59-D339-4E15-89EA-48803DBA271E
Property3=9A876EDD-3B79-C27E-1680-E0820A0CD6EC
}
Цикл Foreach:
var returnList = new List<NewClass>();
foreach (var item in lookupList)
{
returnList.Add(new NewClass
{
Property1 = item.ID1.ToString(),
Property2 = item.ID2.ToString(),
Property3 = item.ID3.ToString(),
.....
});
}
Возврат:
{
Property1=7081C549-64D6-458E-A693-0D2C9C47D183
Property2=06DD6A59-D339-4E15-89EA-48803DBA271E
Property3=9A876EDD-3B79-C27E-1680-E0820A0CD6EC
}
Вопрос:
Почему это происходит и является ли это ожидаемым поведением? Я бы ожидал, что выражение Linq и цикл foreach вернут тот же результат, когда .ToString()
применяется к моему Guid, но так или иначе это не так. Я также проверил, что нет переопределений .ToString()
в любом классе.
Спасибо заранее.
Update:
lookupList
обрабатывается .ToList()
до того, как он ударит мой метод. lookupList
имеет тип List<t>
, где t
- это настраиваемый бизнес-объект, который имеет дополнительные свойства, которых нет в базе данных. Извинения, я не сделал этого ясно в моем первоначальном вопросе.