Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中基于模板的多对象列表排序#_C#_Custom Lists - Fatal编程技术网

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扩展方法的实现谢谢你的反馈,我确实克服了安装库的问题,并测试了你建议的代码。看起来,只有当数字“向上”和“向下”过滤器相等或相差一个时,代码才会工作,但当此模式更改时,它只会正确地对顶部和底部进行排序,这意味着高、中(在上部)和高、中(在底部)放置正确,而低侧则有些混乱。有什么建议吗!!?