【发布时间】:2011-06-08 09:52:21
【问题描述】:
从earlier question 开始,我现在有一个匿名类型的集合
[用户:
用户名(如forename.surname,
用户身份
].
这个“用户”集合最终需要绑定到一个下拉列表。这很好,但我需要做的是按姓氏和名字对它们进行排序。但这很复杂,因为用户名格式是 forename.surname。
在高层次上,这将涉及字符串上的 Split 以分隔名称组件,然后 ToTitleCase() 两个部分,然后将新值存储在 List 中的另一个对象中,然后我可以使用 @ 进行排序987654325@
我突然想到,我正在尝试学习的所有这些花哨的新语法可能包括用几行简洁代码执行此过程的方法。任何人都可以确认或否认这一点吗?
谢谢。
编辑 3:
我想我已经破解了它:
var salesusers = (
from s in lstReport
group s by new { s.SalesUserId,s.Username}
into g
select new
{
Username = g.Key.Username.Split('.')[1].ToTitleCase() + " " + g.Key.Username.Split('.')[0].ToTitleCase(),
Surname = g.Key.Username.Split('.')[1].ToTitleCase(),
Forename = g.Key.Username.Split('.')[0].ToTitleCase(),
UserId = g.Key.SalesUserId
}
).OrderBy(a=> a.Surname).ThenBy(a=> a.Forename);
我需要从用户名中创建单独的名字和姓氏字段以进行排序,并从用户名中创建绑定到下拉列表的字段。这看起来很疯狂,但效果很好,我现在坚持使用它。非常感谢您的 cmets。
EDIT2:
所以我做到了这一点。现在我想知道语法是否允许我将之前问题中的Group by 操作与这一步结合起来..
var sortedUsers = from u in salesusers
orderby u.UserName.Split('.')[1], u.UserName.Split('.')[0]
select new {UserName = u.UserName.Replace(".", " ").ToTitleCase(), UserId = u.UserId.Value};
有人...?
编辑:我自己全部完成大部分,以防万一有人需要,但在订购操作期间转换名称组件ToTitleCase是证明困难。
这个:
var sortedUsers = from u in salesusers
orderby u.UserName.Split('.')[1], u.UserName.Split('.')[0]
select u;
除了ToTitleCaseing 之外,似乎做了诀窍我需要的一切。但是,当然可能有更快/更简洁/更优雅的方法,所以我将把它打开一两天看看会发生什么;-)
【问题讨论】:
-
您可以发布您的解决方案作为答案吗?谢谢。
-
我不认为你可以在 Linq to SQL 的情况下执行 ToTitleCase。因为没有相应的 SQL 构造来执行 ToTitleCase 所做的操作,因此 linq2sql 无法将表达式解析为 SQL。但是你可以在从 SQL 获取数据后在集合对象中做 ToTitleCase
-
@BillTheLizard - 完成。 @Ankur - 我的解决方案(在 OP 下方的 'EDIT 3' 下)工作正常。 ToTitleCase() 是我编写的一个快速 n 脏扩展方法,它使用 TextInfo 对象的方法。我在这里不处理 LINQ to SQL - 原始集合是从数据库中检索的。
标签: c# list sorting anonymous-types