我正在使用Revit API,我有两个列表,一个是Element,另一个是Doubles,这些double是从pointXYZ提取的,这些元素位于Z轴上。 我需要使用双重列表对元素列表进行排序,并且需要使用其他列表(例如曲线,点)。
我尝试使用OrderBy,但不了解如何将另一个列表作为第一个列表的关键。
例如:
List<Elements> listElements = {ele1, ele2, ele3, ele4}
List<double> listDouble = {4.25, 3.2, 5.2, 2.0}
我需要这样的输出:
List<Elements> newListElements = {ele4, ele2, ele1, ele3}
答案 0 :(得分:2)
您可以使用Zip()
方法将值与其排序键组合在一起。合并后,您可以像往常一样用OrderBy()
对它们进行排序,并通过Select()
从压缩的条目中取回值。
static void Main(string[] args)
{
IList<string> values = new List<string> { "abc", "def", "ghi", "jkl", "mno" };
IList<double> sort = new List<double> { 3.4, 5.6, -2.4, 7.5, 1.3 };
IList<string> sortedValues = values
.Zip(sort, (v, s) => new {v, s}) // combine...
.OrderBy(it => it.s) // ...sort...
.Select(it => it.v) // ...extract
.ToList();
Console.WriteLine(string.Join(", ", values));
Console.WriteLine(string.Join(", ", sort));
Console.WriteLine(string.Join(", ", sortedValues));
}
这将产生以下输出:
abc, def, ghi, jkl, mno
3.4, 5.6, -2.4, 7.5, 1.3
ghi, mno, abc, def, jkl
答案 1 :(得分:2)
请参见Array.Sort方法重载。
string[] listElements = { "ele1", "ele2", "ele3", "ele4" };
double[] listDouble = { 4.25, 3.2, 5.2, 2.0 };
Array.Sort(listDouble, listElements);
Console.WriteLine(string.Join(", ", listElements)); // ele4, ele2, ele1, ele3
答案 2 :(得分:1)
您可以那样使用Dictionary
Dictionary<Elements, double> dic = new Dictionary<Elements, double>();
for (int i = 0; i < listDouble.Count; i++)
{
dic.Add(listElements[i],listDouble[i]);
}
var newListElements=dic.OrderBy(x => x.Value).Select(x=>x.Key).ToList();
答案 3 :(得分:1)
我找到了一种无需使用字典即可对项目列表进行排序的更好方法。
此方法从左到右,从上到下排序。 希望对您有所帮助。
public static List<Element> SortLeftRightTopBottom(List<Element> list)
{
// Sort the list by XYZ left to right, top to bottom
list = list.OrderByDescending(pos => (pos.Location as LocationPoint).Point.Y)
.ThenBy(pos => (pos.Location as LocationPoint).Point.X).ToList();
return list;
}