4

我有

List<string> strs;
double[] values;

其中 values 数组包含 strs 列表中每个字符串的值

strs={"abc","def","ghi"}values={3,1,2} 这意味着“abc”的值为 3,依此类推。

我希望对按值排序的 strs 和值进行排序,使其变为

strs={"def","ghi","abc"}
values={3,2,1}

我在用

string[] strsArr = strs.ToArray();
Array.Sort(values, strsArr);//1. sort it ascendingly
strs = strsArr.ToList();
Array.Reverse(strs);//2. reverse it

有没有一种方法可以直接按降序对它进行排序而无需 2 个阶段?

4

3 回答 3

3

您可以使用 Dictionary 和 Linq 来解决这个问题。

var dict = new Dictionary<string, double>() 
{ 
           {"abc",3}, 
           {"def",1}, 
           {"ghi",2} 
};
var sorted = dict.OrderByDescending(g => g.Value)
                 .Select(g => g.Key)
                 .ToArray();

请注意,除非您最后有一个 ToArray(),否则排序将推迟到稍后枚举,并且可能会意外地被枚举多次。

于 2012-10-10T03:18:24.443 回答
2

这个怎么样:

var strs = new [] { "abc", "def", "ghi", };
var values = new [] { 3, 1, 2, };

strs =
    strs
        .Zip(values, (s, v) => new { s, v })
        .OrderByDescending(sv => sv.v)
        .Select(sv => sv.s)
        .ToArray();
于 2012-10-10T03:18:26.603 回答
0

尝试使用字典:

Dictionary<string, double> dictionary = new Dictionary<string, double>();
dictionary.Add("abc", 3);
dictionary.Add("def", 1);
dictionary.Add("ghi", 2);

var sortedDict = dictionary.OrderByDescending(x => x.Value);
double[] values = sortedDict.Select(x => x.Value).ToArray();
List<string> strs = sortedDict.Select(x => x.Key).ToList();
于 2012-10-10T03:13:02.033 回答