[英]Sorting two dimensional array in c#
我正在嘗試對我的字符串數組進行排序,但是我不知道該怎么做:(我有一個看起來像這樣的列表:
在字段上是一個名稱,一個是值,它們都是字符串。 我需要按值對列表進行排序,並返回14個值最大的名稱。 常規排序無法幫助我解決這個問題,所以也許你們中的一個人知道我該怎么做?
using (StreamReader reader = new StreamReader(response.Stream))
{
string line;
while ((line = reader.ReadLine()) != null)
{
resultsList.Add(line);
}
}
var list= new List<string[]>();
foreach (var row in resultsList)
{
var temp = row.Split(new string[] { "\t" }, StringSplitOptions.None);
list.Add(temp);
}
假設您有一個列表,並且值始終是數組的第二個元素,則可以像這樣對列表進行排序
list.Sort((sa1, sa2) => sa1[1].CompareTo(sa2[1]));
如果該值可以不是0-9,則應將其轉換為int。
list.Sort((sa1, sa2) => Int32.Parse(sa1[1]).CompareTo(Int32.Parse(sa2[1])));
當然,正確的做法是構建某個類的列表,而不是使用數組列表,而是依賴於數組結構。
list.OrderByDescending(x=>x[1]).Take(14)
OrderBy部分告訴它獲取初始數組,並根據每個內部數組的第二個元素對其進行排序。 然后,匯整將結果集限制為所需的14個。
這與“ Sort
解決方案不同,因為它以相同的順序保留了原始列表。
看起來您有以下內容:
string[][] arrayOfStringArrays = new string[5][];
arrayOfStringArrays[0] = new string[] { "name1", "value1" };
arrayOfStringArrays[1] = new string[] { "name2", "value2" };
arrayOfStringArrays[2] = new string[] { "name3", "value3" };
arrayOfStringArrays[3] = new string[] { "name4", "value4" };
arrayOfStringArrays[4] = new string[] { "name5", "value5" };
然后,您可以執行以下操作:
var sortedValues = arrayOfStringArrays.Select(e => e.LastorDefault()).OrderBy(s => s);
//created a separate variable for "n" just for illustration purposes
var n = 14;
var firstNElements = sortedValues.Take(n);
list.OrderByDescending(o => o[1]).Take(14);
您可以使用OrderByDescending並將第二個數組值指定為“屬性”排序。 然后進入前14名。
您可以將列表轉換為帶有字符串鍵和int值的字典,這使選擇更加容易:
Dictionary<string,int> dict =
list.Select(i => new KeyValuePair<string, int>(i[0], Convert.ToInt32(i[1]))).ToDictionary(kv=>kv.Key, kv=>kv.Value);
var items = dict.OrderByDescending(d => d.Value).Select(d => d.Key).Take(14);
否則,您可以直接從列表中選擇,但是由於我假設您使用的是string[][]
,因此無法使用OrderBy。 因此,需要一個自定義比較器:
public class ListComparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (x == null)
{
if (y == null)
{
// If x is null and y is null, they're
// equal.
return 0;
}
else
{
// If x is null and y is not null, y
// is greater.
return -1;
}
}
else
{
// If x is not null...
//
if (y == null)
// ...and y is null, x is greater.
{
return 1;
}
else
{
// ...and y is not null, compare the
// int values of the two strings.
//
return Convert.ToInt32(x).CompareTo(Convert.ToInt32(y));
}
}
}
}
然后您就可以使用
var sortedList = list.OrderByDescending(d => d[1], new ListComparer()).Take(14);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.