Linq不区分大小写加入
我想实现两件事情。
首先,我希望这个连接不区分大小写。
我在过去的where子句中使用了这种情况
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;
谢谢。
Linq只支持equi连接,但你可以将每个操作数转换为一种情况或另一种情况:
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;
回答这个问题有点迟,但根据OrdinalIgnoreCase的文档:
由OrdinalIgnoreCase属性返回的StringComparer将字符串中的字符作为比较,如同使用不变文化的约定将其转换为大写字母,然后执行与语言无关的简单字节比较。
那么这将是等效的连接:
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;
Linq支持不区分大小写的匹配,但不支持查询语法。 您需要使用方法语法。
var query = Books.Join(
authors, // the other list
book => book.Author, // what to compare in "Books"
author => author, // what to compare in "authors"
(book, author) => Tuple.Create(author, _count_of_authors_books_), // what to select at the end
StringComparer.InvariantCultureIgnoreCase); // how to do the comparison
StringComparer
有一些其他的变体,使用你需要的变体。