字母组在Linq中有一个扭曲

时间:2016-02-03 13:13:50

标签: c# linq

我有一个棘手的问题。我正在寻找实现以下目标的最简洁,最骇客的方式:

query = (from book in library.books.OrderBy(x=>x.title)
         group book by
         new { title = book.title[0].ToString(), yadiyada="" });

结果是图书馆中按第一个字母分组的所有书籍。 Yadiyada是因为我的组对象不是简单的字符串而是对象。

我想知道是否有一种 LINQ方式来制作它,以便分组是'A','B','C',......'Z',但所有其他属于一个名为'123!@#'的分组。

换句话说,我只想对所有非字母字符进行一次分组(A-> Z + Rest)。

如果我得到冗长的话,我可以通过多种方式做到这一点(目前我只是简单地将两个Linq语句结合起来),但这不是这个问题的目的。我想知道是否有人能想出一个非常巧妙的方法......

2 个答案:

答案 0 :(得分:8)

这取决于纯LINQ方式的含义。如果您想使用单个查询对其进行分组,可以尝试以下方法:

query = (from book in library.books.OrderBy(x=>x.title)
         let c = book.title[0]
         group book by
         new { title = char.IsLetter(c) ? c.ToString() : "123!@#", yadiyada="" });

答案 1 :(得分:0)

我想你想要某种条件分组。您可以使用空字符作为所有非字母字符的占位符:

HashSet<char> alpha = new HashSet<char>("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvqxyz");

var query = books
    .OrderBy(b => b.title)
    .Select(b => new{ Book = b, IsAlpha = alpha.Contains(b.title[0]), Char = b.title[0]} )
    .Select(x => new{ x.IsAlpha, x.Book, Char = x.IsAlpha ? x.Char : '\0' } )
    .GroupBy(x => x.Char);