Linq不区分大小写加入

时间:2015-04-13 18:08:21

标签: c# linq join case-insensitive

我想要实现两件事。

首先,我希望此连接不区分大小写。

我在过去使用了这种不区分大小写的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;

感谢。

4 个答案:

答案 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_);