【发布时间】:2015-10-12 09:46:23
【问题描述】:
我有以下记录
最后 2 个是记录 3 和 4 的子项,我希望能够按数量对记录进行排序,但应该是 非 兴趣(父母)的记录首先排序,然后是他们的孩子们应该出现在之后,例如它会是这样的
2000
2000
20001
99.84 (child of the above)
50000
249.58 (child of the above)
基本上,我希望我的排序方式忽略“IsInterest”设置为 true 的那个,但让他们出现在他们的父母之后。
我可以通过首先将所有父母放入一个新集合中来做到这一点..然后通过父母查看是否有任何孩子然后将它们插入到新集合中的父母之后,但我觉得这既不高效也不肮脏代码所以我想我会问也许有人知道黑魔法。 排序还应该知道数量上的 asc/desc。
如果有帮助,我可以发布我的代码,将集合分开并将其放在一起,但如果可能,我会尽量不使用该代码。
如果有帮助,我的排序方法将字符串用于“升序”或“降序”
谢谢
更新2 我要指出的是,只有 2 个级别,孩子们永远只有一个父母(没有祖父母),每个父母最多有 1 个孩子
更新请求的代码(字段名称可能与数据库字段不同..)
switch (sortMember.ToUpper())
{
case "AMOUNT":
{
//check to see if any imputed interests exist
if (contributions.Any(x => x.IsImputedInterest))
{
var children = contributions.Where(x => x.IsImputedInterest);
var sortedColl = contributions.Where(x => x.IsImputedInterest == false).OrderByWithDirection(x => x.ContributionAmount, sortDirection.ToUpper() == "DESCENDING").ToList();
foreach (var child in children )
{
//find the parent
var parentIndex = sortedColl.FindIndex(x => x.ContributionId == child.ParentContirbutionId);
sortedColl.Insert(parentIndex+1, child);
}
}
else
{
contributions = contributions.OrderByWithDirection(x => x.ContributionAmount, sortDirection.ToUpper() == "DESCENDING");
}
break;
}
}
..................
public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
public static IOrderedQueryable<TSource> OrderByWithDirection<TSource, TKey>(this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, bool descending)
{
return descending ? source.OrderByDescending(keySelector)
: source.OrderBy(keySelector);
}
【问题讨论】:
-
向我们展示您当前的排序方法。
-
你可以在
OrderBy/OrderByDescending之后使用ThenBy/ThenByDescending。 -
你会怎么做,它会第一次像这样对它们进行排序,99.83、249.58、2000.....这不是我想要的
-
要在此站点中获得帮助,您应该遵循其规则/期望。那就是:按照伊万的建议,首先自己尝试一下,然后向我们展示你做了什么。无论如何,我已经把你需要知道的都说了:使用 LINQ,你可以使用
ThenBy/ThenByDescending迭代地重新排序(首先是基于某些条件,然后是基于不同的条件,等等)。 -
@IvanStoev 代码发布
标签: c# performance linq