黑马程序员技术交流社区

标题: C#中有类似复合排序的方法吗 [打印本页]

作者: 思·长安    时间: 2013-11-6 13:20
标题: C#中有类似复合排序的方法吗
本帖最后由 思·长安 于 2013-11-7 16:30 编辑

比如让用户按顺序分别输入公司人数、员工姓名、工资 ,
最后按工资进行排序,工资由高到低依次输出员工的姓名和工资
这个输出的时候怎样把姓名和工资对应起来输出呢?
考虑过用键值对和集合什么的 但是排序无能...
求高手解答


作者: 黑色海    时间: 2013-11-6 20:05
本帖最后由 黑色海 于 2013-11-7 07:26 编辑

在不考虑使用数据库的情况下可以考虑SortedList集合或者SortedDictionary集合,以工资为键,姓名为值,该集合会自动排序,另外集合也有设计排序的方法order By和其下边降序排列的,只是目前这两种鄙人还不会使用。
下面是我简单写的用SortedDictionary测试的的代码,输出时以工资升序打印。
SortedDictionary<int,string>dic=new SortedDictionary<int,string> ();            
            dic.Add( 3500,"王强");
            dic.Add(4000,"刘菲");
            dic.Add( 4500,"吴桐");
            dic.Add(2000,"李茂荣");
            dic.Add(1000,"白翠华");
            dic.Add(6000,"刘忻");         
            foreach (KeyValuePair<int,string> kvp in dic)
            {
                Console.WriteLine("姓名{0}  工资{1}",kvp.Value,kvp.Key);
            }         
            Console.ReadKey();
另外下面是使用LINQ语句查询后得到楼主要的结果,只是在查询结果中发生排序,集合内的排列顺序并未发生改变
Dictionary<string,int>dic=new Dictionary<string,int> ();         
            dic.Add( "王强",3500);
            dic.Add("刘菲",4000);
            dic.Add( "吴桐",4500);
            dic.Add("李茂荣",2000);
            dic.Add("白翠华",1000);
            dic.Add("刘忻",6000);
            //按工资升序
            var result = from ds in dic orderby ds.Value select ds;                       
            foreach (KeyValuePair<string,int> kvp in result)
            {
                Console.WriteLine("姓名{0}  工资{1}",kvp.Key,kvp.Value);            
            }
            //按工资降序
            var result1 = from ds in dic orderby ds.Value descending select ds;
            foreach (KeyValuePair<string, int> kvp in result1)
            {
                Console.WriteLine("姓名{0}  工资{1}", kvp.Key, kvp.Value);
            }
            Console.ReadKey();


作者: 猫咪不吃糖    时间: 2013-11-6 20:54
  1.         static void Main(string[] args)
  2.         {
  3.             int n;//人数
  4.             string name;
  5.             int salary;
  6.             Dictionary<string, int> dict = new Dictionary<string, int>();
  7.             Console.Write("请输入人数:");
  8.             n = Convert.ToInt32( Console.ReadLine());
  9.             for (int i = 0; i < n; i++)
  10.             {
  11.                 Console.Write("请输入姓名:");
  12.                 name = Console.ReadLine();
  13.                 Console.Write("请输入工资:");
  14.                 salary = Convert.ToInt32( Console.ReadLine());
  15.                 dict.Add(name, salary);
  16.             }
  17.             Dictionary<string, int> dic1Asc = dict.OrderBy(o=>o.Value).ToDictionary(o => o.Key, p => p.Value);
  18.             foreach (string s in dic1Asc.Keys)
  19.             {
  20.                 Console.WriteLine(s + ":" + dict[s].ToString());
  21.             }
  22.             Console.ReadKey();
  23.         }
复制代码

作者: 思·长安    时间: 2013-11-7 12:03
猫咪不吃糖 发表于 2013-11-6 20:54

(o => o.Value).ToDictionary(o => o.Key, p => p.Value); 求解这个是什么意思
作者: 思·长安    时间: 2013-11-7 12:05
黑色海 发表于 2013-11-6 20:05
在不考虑使用数据库的情况下可以考虑SortedList集合或者SortedDictionary集合,以工资为键,姓名为值,该集 ...

Sorted{:3_49:}LINQ语句...这个我就已经不会了
作者: 黑色海    时间: 2013-11-7 12:24
思·长安 发表于 2013-11-7 12:05
SortedLINQ语句...这个我就已经不会了

学点SQL基础就很好学了,看看MSDN,其实很好理解
作者: 猫咪不吃糖    时间: 2013-11-7 15:27
思·长安 发表于 2013-11-7 12:03
(o => o.Value).ToDictionary(o => o.Key, p => p.Value); 求解这个是什么意思

声明了一个o,用来指代集合中的一对键值,说明是按o.Value排序。
排序输出的东西拆箱了,ToDictionary再装箱放回去。
作者: 思·长安    时间: 2013-11-7 16:14
猫咪不吃糖 发表于 2013-11-7 15:27
声明了一个o,用来指代集合中的一对键值,说明是按o.Value排序。
排序输出的东西拆箱了,ToDictionary再 ...

明白了 谢谢啦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2