C# c语言中基于模板的多对象列表排序#
我有这样一个清单:C# c语言中基于模板的多对象列表排序#,c#,custom-lists,C#,Custom Lists,我有这样一个清单: | Name | number | order | |------|--------|-------| | rt | 7432 | down | | ht | 2000 | up | | hr | 2730 | up | | cc | 1000 | down | | af | 1430 | down | | ge | 3000 | up | | bb | 4800 | down |
| Name | number | order |
|------|--------|-------|
| rt | 7432 | down |
| ht | 2000 | up |
| hr | 2730 | up |
| cc | 1000 | down |
| af | 1430 | down |
| ge | 3000 | up |
| bb | 4800 | down |
| ke | 1200 | up |
| wd | 1100 | up |
我需要做的是对该列表进行如下排序:
| name | number | order |
|------|--------|-------|
| ge | 3000 | up |
| hr | 2730 | up |
| ht | 2000 | up |
| ke | 1200 | up |
| cc | 1000 | down |
| wd | 1100 | up |
| af | 1430 | down |
| bb | 4800 | down |
| rt | 7432 | down |
- 注
- 该列表分为“向上”和“向下”两组
- “数字”列按以下顺序排列:高、中、低/低、中、高
- 无论是“up”还是“向下”分组,最低行数应在中间,当行数为奇数时,行数为偶数时的中间行之一。
非常感谢您的输入总体而言,必须放置“中间”元素是这里最麻烦的问题。否则很容易实现IComparer或简单地使用linq 不过,您不必手动检查每个值。我不认为下面的linq代码是最佳的,但它相当简单。我使用提供的
MinBy
实现来获取不实现类的最小对象和元组:
List<Tuple<string,int,string>> list = new List<Tuple<string,int,string>>();
list.Add(Tuple.Create<string, int, string>("a",100,"up"));
list.Add(Tuple.Create<string, int, string>("b",99,"up"));
list.Add(Tuple.Create<string, int, string>("c",120,"up"));
list.Add(Tuple.Create<string, int, string>("d",200,"up"));
list.Add(Tuple.Create<string, int, string>("e",112,"down"));
list.Add(Tuple.Create<string, int, string>("f",10,"down"));
list.Add(Tuple.Create<string, int, string>("g",110,"down"));
var temp=list.ToLookup(x => x.Item3);
var up = temp["up"].OrderByDescending(a => a.Item2);
Tuple<string, int, string> lowestUp = up.MinBy(a => a.Item2);
var down=temp["down"].OrderBy(a => a.Item2);
Tuple<string, int, string> lowestDown = down.MinBy(a => a.Item2);
if (lowestDown.Item2 < lowestUp.Item2)
{
var result = up.Union(down.Except(new Tuple<string, int, string>[] { lowestDown })).ToList();
result.Insert(result.Count / 2, lowestDown);
}
else
{
var result = up.Except(new Tuple<string, int, string>[] { lowestUp }).Union(down).ToList();
result.Insert(result.Count / 2, lowestUp);
}
List List=新列表();
list.Add(Tuple.Create(“a”,100,“up”));
添加(Tuple.Create(“b”,99,“up”);
添加(Tuple.Create(“c”,120,“up”);
添加(Tuple.Create(“d”,200,“up”);
添加(Tuple.Create(“e”,112,“down”);
添加(Tuple.Create(“f”,10,“down”);
list.Add(Tuple.Create(“g”,110,“down”));
var temp=list.ToLookup(x=>x.Item3);
var up=temp[“up”].OrderByDescending(a=>a.Item2);
Tuple lowstup=up.MinBy(a=>a.Item2);
var down=temp[“down”].OrderBy(a=>a.Item2);
Tuple lowestDown=down.MinBy(a=>a.Item2);
if(lowestDown.Item2
编辑:
我将“middle”表示为索引计数为/2的元素。您可以使用LINQ和OrderBy,在这里您可以实现自己的功能IComparer@Radinator请您通过代码来展示一下好吗!!?非常感谢您的输入,但MoreLinq似乎不喜欢我的系统,虽然我已经将其添加到我的参考资料中,但在尝试进行参考时它不会显示:)我正在使用.net 4.51,该项目是一个控制台应用程序!!你知道为什么吗@Mehrdad_gh我没有使用这个库,我只是复制了这个答案中提供的MinBy扩展方法的实现谢谢你的反馈,我确实克服了安装库的问题,并测试了你建议的代码。看起来,只有当数字“向上”和“向下”过滤器相等或相差一个时,代码才会工作,但当此模式更改时,它只会正确地对顶部和底部进行排序,这意味着高、中(在上部)和高、中(在底部)放置正确,而低侧则有些混乱。有什么建议吗!!?