2017-08-30 33 views
0

我試圖讓一個擴展方法和我有這個情況有些困難,實例的順序: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) => // 
} 

,但我很快就意識到我需要一些方法通過枚舉接口迭代,找出我需要「跳過」的值,不知何故。任何想法或指向正確的方向?

+1

當'list3'中不存在物品時預期的結果是什麼? – Fabio

+0

如果您願意使用列表而不是IEnumerable,[這裏](https://stackoverflow.com/a/15275394/6741868)是一個可以幫助您的單行答案。 –

+1

@Fabio是的,你的問題是有效的,除非或直到OP回答它,否則很難發佈答案,因爲我不知道該怎麼做,所以我拖延了。更好的是,我要去睡覺:) – CodingYoshi

回答

3

在看下面這個例子:

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什麼。

+0

'list3.Intersect(list1)'將產生'{「A」,「B」,「C」}'不是'{「A」 ,「C」,「B」}。這不是問題所在,而是OP已經接受了,所以問題可能是錯誤的。 – CodingYoshi

+0

@CodingYoshi,在「{」D「,」A「,」C「的情況下。 「A」,「B」,「C」}的結果應該是「{」A「,」B「,」C「}',只有神祕的東西仍然是' 「D」'不存在於「order」集合中 – Fabio

+0

我誤解了,你們倆在這些情況下都是正確的。 –

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