比较字符串无法按预期工作

时间:2016-06-14 08:40:16

标签: c# asp.net-mvc

请考虑以下代码段。

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];获取登录用户的用户名为了测试目的,我将我的用户名和另一个用户名放在列中,但似乎是检查每个用户名然后返回给我{{1因为我的用户名在列中,所以它不应该这样做。有人可以告诉我,我在哪里出错。

以下是我使用

的扩展方法
Unauthorized

2 个答案:

答案 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

答案 1 :(得分: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;
}

谢谢。