2012-10-09 24 views
0

如何根据数组

List<string> strs; 
double[] values; 

其中values数组包含strs列表

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

,这意味着每一个字符串的值值排序列表“ABC”有值3等。

我想排序strsvalues通过values有序,使得它成为

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

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

+0

这是更好地使用词典的情况下, ,而不是两个列表 –

+0

为什么不使用字典,如果你有这样的映射? –

+0

或者,如果你不介意将两个数组存储在同一个对象中,你可以使用SortedList wes

回答

2

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

string[] strsArr = strs.ToArray(); 

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

Array.Sort(values, strsArr); 

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

strs = strsArr.ToList(); 
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(); 
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

你如何设置这些集合?还是你给了这两个参数?

您可以创建一个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); 
1

你为什么不使用字典对象..

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(); 
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();