我正在尝试制作扩展方法,并且在这种情况下遇到了一些困难,例如:
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" }
这等同于您的尝试,而无需Zip
或Join
。
public static IEnumerable<T> OrderByEnumerable<T>(this IEnumerable<T> data,
IEnumerable<T> data2)
{
return data.Except(data2).Any() ? data : data2.Join(data, _ => _, _ => _, (_, __) => _);
}