如何根据数组中的值对List进行排序

时间:2012-10-09 12:49:19

标签: c#

我有

List<string> strs;
double[] values;

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

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

这意味着“abc”的值为3,依此类推。

我希望按strs排序valuesvalues,以便它变为

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

有没有简单的方法来实现这个目标?

6 个答案:

答案 0 :(得分:2)

您可以使用Enumerable.Zip,然后对结果进行排序,然后提取字符串列表。

类似的东西:

var result = strs.Zip(values, (first, second) => new Tuple<string, double>(first, second))
            .OrderBy(x => x.Item2)
            .Select(x => x.Item1)
            .ToList();

答案 1 :(得分:2)

var sortedStrs = strs.Select((i, s) => new {Value = values[i], Str = s})
                     .OrderBy(x => x.Value)
                     .Select(x => x.Str).ToList();

如果您可以逻辑地将这些值作为类的属性,例如:

class NameAndOrder
{
    public string Name;
    public int Order;
}

然后它会更好,更有条理,然后你就可以做到:

var items = new List<NameAndOrder>(strs.Count);

for (var i = 0; i < strs.Count; i++)
{
    items.Add(new NameAndOrder { Name = strs[i], Order = values[i] });
}

items.Sort((a, b) => a.Order.CompareTo(b.Order));

答案 2 :(得分:2)

您是如何设置这些系列的?或者你给了这两个参数?

您可以创建StringAndOrder课程并使用 LINQ

public class StringAndOrder
{
    public string String { get; set; }
    public double Order { get; set; }
}

List<StringAndOrder> list; //create with this structure instead
var orderedStrings = list.OrderBy(item => item.Order).Select(item => item.String);

答案 3 :(得分:2)

Array.Sort方法有一个重载,需要两个数组并根据第一个数组中的值对两个数组进行排序,所以从列表中创建一个数组:

string[] strsArr = strs.ToArray();

然后对它们进行排序不能简单:

Array.Sort(values, strsArr);

然后回到列表,如果你需要:

strs = strsArr.ToList();

答案 4 :(得分:1)

为什么不使用Dictionary对象..

Dictionary<string, int> dictionary =
    new Dictionary<string, int>();
dictionary.Add("cat", 2);
dictionary.Add("dog", 1);
dictionary.Add("llama", 0);
dictionary.Add("iguana", -1);
// Acquire keys and sort them.
var list = dictionary.Keys.ToList();
list.Sort();

答案 5 :(得分:1)

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

var newArr = strs.Select((s, i) => new { s, i })
                 .OrderBy(x => values[x.i])
                 .Select(x => x.s)
                 .ToArray();