基于另一个列表对动态对象列表进行排序

时间:2015-05-29 14:53:54

标签: c# asp.net sorting

我有两个清单。一个是动态的对象列表。另一个是字符串列表。我想根据其他列表对对象列表进行排序。

Page 1
+----+-----------+
| ID | Continent |
+----+-----------+
| 01 | Europa    |
+----+-----------+

+----+-------------+
| ID | Countries   |
+----+-------------+
| 01 | Italia      |
+----+-------------+
| 02 | Switzerland |
+----+-------------+
| 03 | Germany     |
+----+-------------+

Page 2
+----+-----------+
| ID | Continent |
+----+-----------+
| 01 | America   |
+----+-----------+

+----+-------------+
| ID | Countries   |
+----+-------------+
| 01 | USA         |
+----+-------------+
| 02 | Equador     |
+----+-------------+
| 03 | Perù        |
+----+-------------+
| 04 | Etc.        |
+----+-------------+

这些对象具有“alphabets”属性之一,必须对其进行排序。

对象可能不等于第二个列表中的元素数。

2 个答案:

答案 0 :(得分:0)

如果两个列表的索引符合您的要求,那么这样的事情可能会起作用。您必须确保列表具有相同的长度才能使其正常工作。

var result = list1
    .Select((item, index) => 
        new 
        {
            Item = item, 
            Order = list2[index]
        })
    .OrderBy(x => x.Order)
    .Select(x => x.Item);

如果它们的长度不同,订单的标准是什么?那将是一个未定义的问题。一种方法是将它们放在列表的末尾。

var result = list1.Take(list2.Length)
    .Select((item, index) => 
    new 
    {
        Item = item, 
        Order = list2[index]
    })
    .OrderBy(x => x.Order)
    .Select(x => x.Item);
var concatted = result.Concat(list1.Skip(list2.Length));

答案 1 :(得分:0)

好吧,假设List1包含一个对象列表,并且每个对象都包含一个名为" alphabet"的属性,并且您想要对此对象列表进行排序,但是在List2中指定了排序顺序按排序顺序排列的字母表的可能值,然后你可以这样做:

int i=0;
var List2WithRowNum = from str2 in List2.AsEnumerable() select new{ rowNum = i++, str2 };
var sortedList = from obj1 in List1.AsEnumerable()
        join strKey in List2WithRowNum.AsEnumerable() on ((listObject)obj1).alphabet equals strKey.str2
        orderby strKey.rowNum
        select obj1;

sortedList将是原始对象(来自List1)的列表,按其"字母表排序"属性,以List2顺序。