2015-04-13 7 views
3

Я хочу достичь двух вещей.Линк нечувствительный к регистру

Во-первых, я хочу, чтобы это соединение было нечувствительным к регистру.

Я использовал этот случай нечувствительным, где положение в прошлом

where b.foo.Equals(foo, StringComparison.OrdinalIgnoreCase) 

, но я не сейчас, как использовать его в присоединиться.

Во-вторых, я хотел бы вернуть кортеж с именем авторов и их книгами.

 var query = from b in Books 
        join a in authors on b.Author equals a 
        select Tuple.Create(a, _count_of_authors_books_); 

     return query; 

Спасибо.

+0

Попробуйте использовать 'string.equals'. –

ответ

4

Linq поддерживает только оборуды-соединение, но вы можете преобразовать каждый операнд в одном случай или другой:

var query = from b in Books 
       join a in authors on b.Author.ToLower() equals a.ToLower() 
       select Tuple.Create(a, _count_of_authors_books_); 

    return query; 

Обратите внимание, что это может иметь некоторые интересные результаты в некоторых культурах; если это вызывает озабоченность, потом еще менее производительным способом было бы сделать перекрестное соединение с фильтром равенства:

var query = from b in Books 
       from a in authors 
       where String.Compare(b.Author, a, true) == 0 
       select Tuple.Create(a, _count_of_authors_books_); 

    return query; 
1

вы можете использовать ToLower() или ToUpper() как на строку, чтобы соответствовать их дела:

var query = from b in Books 
      join a in authors on b.Author.ToLower() equals a.ToLower() 
      select Tuple.Create(a, _count_of_authors_books_); 
+0

Или «ToLowerInvariant», который игнорирует любые различия в культуре в корпусе. – KeithS

+0

Это появилось в очереди «Низкое качество». Я думаю, что это было вероятно потому, что вы не дали никакого объяснения вашему ответу, поэтому я бы рекомендовал сделать это, если бы мог. – AdamMc331

1

немного поздно ответить на это, но в соответствии с документацией на OrdinalIgnoreCase:

TheStringComparer возвращаемый свойством OrdinalIgnoreCase трактует Charac в строках для сравнения, как если бы они были преобразованы в верхний регистр с использованием условностей инвариантной культуры, а затем выполняет простое сравнение байтов, которое не зависит от языка.

Тогда это было бы равнозначно присоединиться:

var query = from b in Books 
      join a in authors on b.Author.ToUpperInvariant() equals a.ToUpperInvariant() 
      select Tuple.Create(a, _count_of_authors_books_); 

return query; 
Смежные вопросы