如何使用linq和Compareto方法对二维数组进行排序?

时间:2010-06-19 17:07:44

标签: c# .net visual-studio visual-studio-2008

如何使用linq和没有linq的Copareto对2D数组进行排序。我可以用list generic做到这一点。但我不喜欢它。你能对它有任何想法吗?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace TestFillArray { class Program { static void Main(string[] args) {

DataTable table = GetTable(); int[,] mySortedLists = new int[table.Rows.Count, table.Columns.Count]; for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { mySortedLists[i, j] += table.Rows[i][j].ToString().Length; } } List<int> list = new List<int>(); for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { Console.WriteLine(mySortedLists[i, j].ToString()); list.Add(int.Parse(mySortedLists[i, j].ToString())); } } list.Sort(); list.Reverse(); foreach (int item in list) { Console.WriteLine(item.ToString()); } Console.ReadKey(); } static DataTable GetTable() { // // Here we create a DataTable with four columns. // DataTable table = new DataTable(); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(string)); table.Columns.Add("Date", typeof(DateTime)); // // Here we add five DataRows. // table.Rows.Add(25, "Indocin", "David", DateTime.Now); table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now); table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now); table.Rows.Add(21, "Combivent", "Janet", DateTime.Now); table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now); return table; } }
DataTable table = GetTable(); int[,] mySortedLists = new int[table.Rows.Count, table.Columns.Count]; for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { mySortedLists[i, j] += table.Rows[i][j].ToString().Length; } } List<int> list = new List<int>(); for (int i = 0; i < table.Rows.Count; i++) { for (int j = 0; j < table.Columns.Count; j++) { Console.WriteLine(mySortedLists[i, j].ToString()); list.Add(int.Parse(mySortedLists[i, j].ToString())); } } list.Sort(); list.Reverse(); foreach (int item in list) { Console.WriteLine(item.ToString()); } Console.ReadKey(); } static DataTable GetTable() { // // Here we create a DataTable with four columns. // DataTable table = new DataTable(); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Patient", typeof(string)); table.Columns.Add("Date", typeof(DateTime)); // // Here we add five DataRows. // table.Rows.Add(25, "Indocin", "David", DateTime.Now); table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now); table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now); table.Rows.Add(21, "Combivent", "Janet", DateTime.Now); table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now); return table; } }

1 个答案:

答案 0 :(得分:1)

你的问题不是很清楚 - 你有什么样的输入,你希望得到什么输出?

根据您的示例,您似乎只想将2D数组的所有元素作为单个列表,然后对元素执行一些操作。要将2D数组转换为包含所有元素的单个IEnumerable,您可以编写:

IEnumerable<T> AsEnumerable(this T[,] arr) {
  for(int i = 0; i < arr.GetLength(0); i++)
    for(int j = 0; j < arr.GetLength(1); j++)
      yield return arr[i, j];
}

然后写例如:

int[,] data = // get data somwhere
// After 'AsEnumerable' you can use all standard LINQ operations
var res = data.AsEnumerable().OrderBy(n => n).Reverse();