字母组在林克与扭曲
本文关键字:林克 | 更新日期: 2023-09-27 18:33:06
我有一个棘手的问题。我正在寻找实现以下目标的最简洁、最黑客的方法:
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 语句联合起来),但这不是这个问题的目的。我想知道是否有人能想出一种非常巧妙的方法......
这取决于纯 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="" });
我认为
你想要某种条件分组。您可以使用空字符作为所有非字母字符的占位符:
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);