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有一些其他的变体,使用你需要的变体。

链接地址: http://www.djcxy.com/p/75231.html

上一篇: Linq case insensitive join

下一篇: linq case insensitive (without toUpper or toLower)