List<string> strs;
double[] values;
其中values
数组包含strs
列表
Say strs={"abc","def","ghi"}
and values={3,1,2}
,这意味着每一个字符串的值值排序列表“ABC”有值3等。
我想排序strs
和values
通过values
有序,使得它成为
strs={"def","ghi","abc"}
values={1,2,3}
有没有简单的方法来实现这一目标?
List<string> strs;
double[] values;
其中values
数组包含strs
列表
Say strs={"abc","def","ghi"}
and values={3,1,2}
,这意味着每一个字符串的值值排序列表“ABC”有值3等。
我想排序strs
和values
通过values
有序,使得它成为
strs={"def","ghi","abc"}
values={1,2,3}
有没有简单的方法来实现这一目标?
的Array.Sort
方法的重载需要两个数组并根据第一个数组中的值对两个数组进行排序,因此从列表中创建一个数组:
string[] strsArr = strs.ToArray();
然后对它们进行排序不能再简单:
Array.Sort(values, strsArr);
然后回一个列表,如果你需要:
strs = strsArr.ToList();
您可以使用Enumerable.Zip
,然后对结果进行排序,然后提取字符串列表。
喜欢的东西:
var result = strs.Zip(values, (first, second) => new Tuple<string, double>(first, second))
.OrderBy(x => x.Item2)
.Select(x => x.Item1)
.ToList();
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));
你如何设置这些集合?还是你给了这两个参数?
您可以创建一个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);
你为什么不使用字典对象..
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();
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();
这是更好地使用词典的情况下, ,而不是两个列表 –
为什么不使用字典,如果你有这样的映射? –
或者,如果你不介意将两个数组存储在同一个对象中,你可以使用SortedList –
wes