从另一个数组顺序中排序一个数组?

时间:2011-03-01 18:22:59

标签: c# arrays linq sorting

var listOne = new string[] { "dog", "cat", "car", "apple"};
var listTwo = new string[] { "car", "apple"};

我需要的是按listTwo中的项目顺序(如果存在)订购listOne。所以新的清单将按此顺序排列;    “汽车”,“苹果”,“狗”,“猫”

我想在LINQ中这样做并尝试过这个;

var newList = from l1 in listOne
              join l2 in listTwo on l1 equals l2 in temp
              from nl temp.DefaultIfEmpty()
              select nl;

但它返回null,显然我的Linq-Fu很弱。任何建议表示赞赏。

2 个答案:

答案 0 :(得分:4)

您需要listOne中listTne中的所有项目,然后是listOne中的其余项目吗?

var results = listTwo.Intersect(listOne).Union(listOne);
foreach (string r in results)
{
    Console.WriteLine(r);
}

答案 1 :(得分:3)

好吧,让我改一下你的排序要求:

  1. 首先,第一个列表中的所有项目(也存在于第二个列表中)按照它们出现在第二个列表中的顺序返回:第二个列表中的所有元素列表,如果它们出现在第一个列表中
  2. 然后,第一个列表中的所有项目(不在第二个列表中),并按照它们在第一个列表中出现的顺序返回
  3. 这段代码可以解决问题:

    void Main()
    {
        var listOne = new string[] { "dog", "cat", "car", "apple"};
        var listTwo = new string[] { "car", "apple"};
    
        var elements1 =
            from element in listTwo
            where listOne.Contains(element)
            select element;
        var elements2 =
            from element in listOne
            where !listTwo.Contains(element)
            select element;
    
        elements1.Concat(elements2).Dump();
    }
    

    你也可以在没有LINQ语法的情况下重写它,使其缩短一点:

    void Main()
    {
        var listOne = new string[] { "dog", "cat", "car", "apple"};
        var listTwo = new string[] { "car", "apple"};
    
        var elements = listTwo.Where(e => listOne.Contains(e))
            .Concat(listOne.Where(e => !listTwo.Contains(e)));
    
        elements.Dump();
    }
    

    输出(通过LINQPad):

    car 
    apple 
    dog 
    cat 
    
相关问题