我有以下代码。这是基于使用临时容器来选择特定项目,然后将它们添加到列表的末尾。
var allRoles = roles.Table
.AsEnumerable().Select(p => new FirmRole
{
Code = p.Field<string>("RoleName"),
Name = p.Field<string>("RoleName")
})ToList();
var formRoles = allRoles.Where(p => p.Code.StartsWith("f")).ToList();
var otherRoles = allRoles.Except(formRoles).ToList();
otherRoles.AddRange(formRoles);
这是缩短此代码并摆脱临时列表的更好方法吗?
像
这样的东西 var allRoles = roles.Table
.AsEnumerable().Select(p => new FirmRole
{
Code = p.Field<string>("RoleName"),
Name = p.Field<string>("RoleName")
}).OrderBy(x=>x.Code.StartsWith("f")).ThenBy(a=>a);
答案 0 :(得分:1)
在IEnumerable<T>
上(就像在这种情况下),你是对的,因为OrderBy
是一个稳定的排序(参见Enumerable.OrderBy:此方法执行稳定排序;即,如果两个元素的键相等,则保留元素的顺序。,因此对于具有相同键的元素,它们的先前顺序是保持的。在IQueryable<T>
上,这不是保证
var allRoles = roles.Table
.AsEnumerable().Select(p => new FirmRole
{
Code = p.Field<string>("RoleName"),
Name = p.Field<string>("RoleName")
}).Distinct()
.OrderBy(x => x.Item.Code.StartsWith("f"))
.ToList();
请注意,您不需要进行二次订购,因为OrderBy
正如我所说的那样稳定。
Speedwise:您必须使用小型和大型套件对其进行基准测试。 OrderBy
应为O(nlogn)
,但按true
/ false
排序(如本例所示)可能更类似于O(n)
答案 1 :(得分:0)
第二个例子读得更好。
不要认为在Distinct()之后需要.ToList()。
希望有所帮助
答案 2 :(得分:0)
您应该使用GroupBy和ToLookup来获取您要查找的结果。
var allRoles = roles.Table
.AsEnumerable().Select(p => new FirmRole
{
Code = p.Field<string>("RoleName"),
Name = p.Field<string>("RoleName")
}).GroupBy(x => x.StartsWith("f")).ToLookup(g => g.Key);;
var formRoles = allRoles[true].ToList();
var otherRoles = allRoles[false].ToList();
答案 3 :(得分:0)
我相信您可以基于IComparer<T>
界面实现自定义排序比较类,以提供所需的自定义排序:
public class CustomSortComparer : IComparer<string>
{
public int Compare(string x, string y)
{
StringComparer sc = StringComparer.CurrentCultureIgnoreCase;
if (string.IsNullOrEmpty(x) || string.IsNullOrEmpty(y))
{
return sc.Compare(x, y);
}
if (x.StartsWith("f", StringComparison.CurrentCultureIgnoreCase) &&
!y.StartsWith("f", StringComparison.CurrentCultureIgnoreCase))
{
return 1;
}
if (y.StartsWith("f", StringComparison.CurrentCultureIgnoreCase) &&
!x.StartsWith("f", StringComparison.CurrentCultureIgnoreCase))
{
return -1;
}
return sc.Compare(x, y);
}
}
然后致电:
var allRoles = roles.Table
.AsEnumerable().Select(p => new FirmRole
{
Code = p.Field<string>("RoleName"),
Name = p.Field<string>("RoleName")
}).OrderBy(x => x.Code, new CustomSortComparer()).ToList();