Linq不区分大小写加入

rlu*_*uks 5 c# linq join case-insensitive

我想实现两件事.

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

我过去曾使用过这种不敏感的where子句

where b.foo.Equals(foo, StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

但我现在不知道如何在加入中使用它.

其次,我想返回带有作者姓名和书籍数量的元组.

        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;
Run Code Online (Sandbox Code Playgroud)

谢谢.

gun*_*171 10

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
Run Code Online (Sandbox Code Playgroud)

StringComparer 还有其他一些变化,请使用所需的变化。


D S*_*ley 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;
Run Code Online (Sandbox Code Playgroud)

请注意,这可以在某些文化中产生一些有趣的结果; 如果这是一个问题,那么另一种效率较低的方法是使用相等过滤器进行交叉连接:

    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;
Run Code Online (Sandbox Code Playgroud)


Joe*_*der 5

回答这个有点晚了,但根据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;
Run Code Online (Sandbox Code Playgroud)