我想要实现两件事。
首先,我希望此连接不区分大小写。
我在过去使用了这种不区分大小写的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;
感谢。
答案 0 :(得分:8)
Linq仅支持equi-joins,但您可以将每个操作数转换为一个或另一个:
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 :(得分:6)
Linq 支持加入不区分大小写的匹配,但不支持查询语法。您需要使用Method Syntax。
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
还有其他一些变体,请使用您需要的变体。
答案 2 :(得分:2)
回答这个问题有点迟,但根据OrdinalIgnoreCase上的文档:
OrdinalIgnoreCase属性返回的TheStringComparer将字符串中的字符视为比较,就像使用不变文化的约定将它们转换为大写一样,然后执行独立于语言的简单字节比较。
然后这将是等效的连接:
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;
答案 3 :(得分:0)
您可以在两个字符串上使用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_);