#c# #.net #linq #.net-4.0 #asp.net-membership
#c# #.net #linq #.net-4.0 #asp.net-членство
Вопрос:
В приведенном ниже коде я хочу сравнить два идентификатора GUID. Проблема в том, что я не получаю никаких возвращаемых задач, потому что идентификаторы GUID имеют разный регистр (верхний и нижний регистр). Мне нужно выполнить сравнение без учета регистра.
MembershipUser membershipUser = Membership.GetUser();
string strUserId = membershipUser.ProviderUserKey.ToString();
Guid userId = new Guid(strUserId.ToUpper());
lblUserId.Text = userId.ToString();
DataModelEntities dc = new DataModelEntities();
var userTasks = dc.tasks.Where(t => t.user_id == userId).ToList();
Как мне сравнить идентификаторы GUID и найти совпадения независимо от регистра?
ОБНОВЛЕНИЕ 1 теперь идентификатор guid из поставщика членства преобразуется в идентификатор GUID
Guid userId = (Guid) membershipUser.ProviderUserKey;
Но я все еще не получаю никаких совпадений.
Комментарии:
1. Почему вы сравниваете идентификаторы GUID как строки, а не просто как
System.Guid
?2. @Matt — Как мне выполнить преобразование в идентификатор GUID? Я искал преобразование. ToGuid (или что-то подобное), но ничего не смог найти.
3.вы можете использовать
Guid.Parse(...)
,Guid.TryParse(...)
илиGuid.TryParseExact(...)
msdn.microsoft.com/en-us/library/system.guid.aspx
Ответ №1:
== перегружен в Guid, поэтому вам не нужно сравнивать строковые представления.
Смотрите http://msdn.microsoft.com/en-us/library/system.guid.op_equality (v = VS.90).aspx
Комментарии:
1. В документации явно не указано, что сравнение учитывает регистр. Делает ли это? Как мы можем быть уверены?
2. Операторы Guid поддерживают как
==
, так и!=
Ответ №2:
Не уверен, почему вы сравниваете их как текст, но вместо t.user_id == userId
использования t.userId.Equals(userId, StringComparison.OrdinalIgnoreCase)
Комментарии:
1. Внимание, equals требует, чтобы идентификатор пользователя был ненулевым. Используйте StringComparer. OrdinalIgnoreCase.Equals(str1, str2)
2. Или
String.Equals(x, y, StringComparison.OrdinalIgnoreCase)
Ответ №3:
У меня всегда была проблема с использованием == для сравнения столбцов guid / uniqueidentifier в операторах linq (особенно в предложении where), поэтому я выбрал довольно безопасный путь использования — (entityGuidColumn.compareTo(guidParameter) ==0) . У меня это сработало. Попробуйте.
Ответ №4:
Простой способ игнорировать регистр при выполнении сравнения строк — это просто преобразовать все в нижний (или верхний) регистр перед сравнением. Итак:
var userTasks = dc.tasks.Where(t => t.user_id.ToString().ToLower() == userId.ToString().ToLower()).ToList();
При этом я согласен с другими комментаторами в том, что вы должны использовать сравнение собственных идентификаторов GUID, а не сравнение строк.
Комментарии:
1. Используйте
StringComparison
вместоToLower()
/ToUpper()
из каменного века2. Это откачивает больше памяти (что может быть значительным узким местом в зависимости от объема «задач») и может давать неправильные результаты в зависимости от локали.
3. Я знал, что это увеличивает объем памяти — я в основном работаю над проблемами, когда память и вычислительные циклы дешевы, что делает меня чрезмерно ленивым. Однако я не осознавал, что это может дать неверные результаты. Спасибо за подсказку, мне нужно будет узнать больше (как всегда)…