C# Linq - 根据另一个 IEnumerable 项的顺序对 IEnumerable 进行排序



我正在尝试制作扩展方法,并且在这种情况下遇到了一些困难,例如:

IEnumerable<string> list1 = // { "A", "B", "C" }
IEnumerable<string> list2 = // { "B", "D" }
IEnumerable<string> list3 = // { "D", "A", "C". "B" } 
list1.OrderByEnumerable(list3) -> // { "A", "C", "B" }
list2.OrderByEnumerable(list3) -> // { "D", "B" } 

我一直在尝试以下方式:

static IEnumerable<T> OrderByEnumerable<T>(this IEnumerable<T> data, IEnumerable<string> data2)
{
    return data.Zip(data2, (x, y) => //
}

,但我很快意识到我需要某种方法来迭代枚举,以找出我需要以某种方式"跳过"一个价值。有任何想法或指针朝正确的方向吗?

在查看此示例时:

list1.OrderByEnumerable(list3) -> // { "A", "C", "B" }

...我不禁注意到列表与list3完全相同,如果这些列表不出现在list1中,则删除了这些列表。

所以也许您只需要相交并完成:

list3.Intersect(list1) -> // { "A", "C", "B" }

当然,list1总是可能包含一些不在list3中的项目,但是在这种情况下您没有指定要求。我想您可以将它们添加到最后:

list3.Intersect(list1).Union(list1.Except(list3)); -> // { "A", "C", "B" }

这等同于您的尝试,而无需ZipJoin

public static IEnumerable<T> OrderByEnumerable<T>(this IEnumerable<T> data,
                                                       IEnumerable<T> data2)
{
    return data.Except(data2).Any() ? data : data2.Join(data, _ => _, _ => _, (_, __) => _);
}

最新更新