2016-06-14 6 views
1

Рассмотрите следующий фрагмент кода.Сравнение строки не работает должным образом

var query = (from a in db.MyEntity 
         where a.MyEntityId == id 
         select a.Team).FirstOrDefault(); 

string userName = userDto.UserName.Replace('.', ' '); 
string[] teamArray = query.Split(new char[] { ',' }); 

for (int i = 0; i < teamArray.Count(); i++) 
{ 
    if (!teamArray[i].Contains(userName, StringComparison.OrdinalIgnoreCase)) 
     { 
     return View("Unauthorized"); 
     } 
} 

У меня есть столбец в базе данных, которая имеет , отделенные значения внутри него, т.е.

User 1, User 2, User 3 ...

У меня нет контроля над сколько пользователей, которые идут в этой колонке. То, что я пытаюсь достичь, - показать страницу Unauthorized любому пользователю, которого нет в этом столбце. Я получаю имя пользователя для входа в систему, используя HttpContext.Current.User.Identity.Name.Split('\\')[1];. Для целей тестирования я поместил свое имя пользователя в столбец вместе с другим, но, похоже, проверяет каждое имя пользователя, а затем возвращает мне Unauthorized, который он не должен делать, потому что мой имя пользователя находится в столбце. Может кто-то сказать мне, где я ошибся, пожалуйста.

Ниже метод расширения я использую

public static bool Contains(this string source, string toCheck, StringComparison comp) 
{ 
    return source.IndexOf(toCheck, comp) >= 0; 
} 

ответ

2

, но это, кажется, проверка каждого отдельного имени пользователя

Да, это именно то, что вы делаете здесь

string[] teamArray = query.Split(new char[] { ',' }); 

for (int i = 0; i < teamArray.Count(); i++) 
{ 
    if (!teamArray[i].Contains(userName, StringComparison.OrdinalIgnoreCase)) 
    { 
     return View("Unauthorized"); 
    } 
} 

Вы вызываете свой метод Contains для каждая строка в teamArray. И так как ваш userName будет соответствовать только одному (если есть), все остальные вернут вам ошибку.

Кажется, вы путаете две вещи. Вы хотите, чтобы проверить, если любой струн в teamArray спичек userName:

string[] teamArray = query.Split(new char[] { ',' }); 
if (!teamArray.Contains(userName, StringComparer.OrdinalIgnoreCase)) 
    return View("Unauthorized"); 

Так используйте этот teamArray.Contains(...), чтобы проверить, если userName находится внутри вашего teamArray.

+0

Должен ли я создать 'IEnumerable '? Можете ли вы привести пример, если вы не возражаете – Code

+0

@Code your'teamArray'_is_ a 'IEnumerable '. просто замените цикл 'for' моим последним фрагментом кода. –

+0

Я сделал то, что вы предложили, и я получаю следующее сообщение об ошибке: '' string [] 'не содержит определения для' Contains 'и лучший метод перегрузки' Queryable.Contains (IQueryable , строка, IEqualityComparer ) 'требует приемник типа «IQueryable )' – Code

0

Смотрите ниже:

public static bool Contains(string source, string toCheck) 
{ 
    var results = Array.FindAll(source.split(','), s => s.Equals(toCheck)); 
    if(results.Length > 0) 
     return true; 
    else 
     return false; 
} 

Спасибо.