排序元素列表和另一个双打列表

时间:2019-08-17 12:27:27

标签: c#

我正在使用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}

4 个答案:

答案 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;
}