2015-01-27 3 views
0

Как я могу преобразовать ниже Еогеасп заявления в соответствующей LINQ с возможностью обработки нуля:переключатель случай в Linq запрос

foreach (var val in userData.ManagedUsers.Values) 
     { 
      if (val.UserId == userId) 
      { 
       foreach (var role in val.Roles) 
       { 
        switch (role.ToLower()) 
        { 
         case "underwriter1": 
          return "1"; 
         case "underwriter2": 
          return "2"; 
         case "underwriter3": 
          return "3"; 
        } 
       } 
      } 
     } 
+1

Нет оснований downvote. Это был законный вопрос. – webworm

ответ

3

Вы могли бы использовать это:

string result = userData.ManagedUsers.Values 
    .Where(u => u.UserId == userId) 
    .SelectMany(u => u.Roles) 
    .Select(r => { 
     if(String.Equals(r, "underwriter1", StringComparison.InvariantCultureIgnoreCase)) 
      return "1"; 
     else if(String.Equals(r, "underwriter2", StringComparison.InvariantCultureIgnoreCase)) 
      return "2"; 
     else if(String.Equals(r, "underwriter3", StringComparison.InvariantCultureIgnoreCase)) 
      return "3"; 
     else return null; 
    }).First(r => r != null); 

Я не использую switch здесь потому что вам нужно использовать ToLower для сравнения без учета регистра. Затем вы не передаете turkey test. Поэтому я использую String.Equals с InvariantCultureIgnoreCase, который также более эффективен и обрабатывает корпус, который Role is null.

Кстати, это, кажется, даже лучше, если я понимаю вашу логику правильно:

string result = userData.ManagedUsers.Values 
    .Where(u => u.UserId == userId) 
    .SelectMany(u => u.Roles) 
    .Select(r => r != null && r.StartsWith("underwriter") ? r.Substring("underwriter".Length) : null) 
    .First(); 
+0

Вы пробовали это? (Кто-нибудь, кто поддержал, или OP, который принял?) – Rawling

+0

@ Rawling: было трудно проверить без классов или выборочных данных. –

+0

Непросто проверить «интересный» шаг с помощью 'new string [0]'. – Rawling

Смежные вопросы