2014-03-25 39 views
0

比較兩個列表對象我有有不同類型的對象如何用流利的LINQ

List<Type1> list1 
List<Type2> list2 

Type1和Type2之間唯一的共同點是ID屬性和日期屬性的兩個列表。

如何獲得ID和日期屬性相等的項目列表?

var list3 = list1.where(x=>x.id == ?? 

感謝

+0

創建一個通用接口(或基類)。 –

+0

...然後使用'Join()' – SLaks

+0

任何示例?碼? – user2206329

回答

0

您可以加入多個領域,但你需要別的東西來它們的值存儲英寸

假設其它性能Type1Type2之間的所有不同的,你」你需要第三個課程來存儲你想要保存的信息。

var results 
    = (from l1 in list1 
     join l2 in list2 on new { l1.ID, l1.Date} equals new { l2.ID, l2.Date } 
     select new SomeThirdClass { }); 
+0

你會如何寫流利的語法? – user2206329

+0

如果你想嘗試,我會把它留給你。您需要閱讀[加入](http://msdn.microsoft.com/zh-cn/library/bb534675.aspx)方法。有時查詢語法比方法語法更容易閱讀,具體取決於您要做什麼。 –

1

如果你想使用擴展方法,你可以使用.Join()方法。

var combination = list1.Join(list2, 
    l1 => new { l1.Id, l1.Date }, 
    l2 => new { l2.Id, l2.Date }, 
    (l1, l2) => Tuple.Create(l1, l2)); 
+0

@Enigmativity對不起,你是對的。評論刪除 – agarwaen

+0

@agarwaen - 同樣。 – Enigmativity

0

創建一個公共基類或接口併爲其實現IEqualityComparer。

public class BaseClass 
{ 
    public int Id; 
    public DateTime Date; 
} 

class Type1: BaseClass 
{ 


} 

class Type2 : BaseClass 
{ 


} 

public class BaseClassComparer : IEqualityComparer<BaseClass> 
{ 
    #region IEqualityComparer<BaseClass> Members 

    public bool Equals(BaseClass x, BaseClass y) 
    { 
     return x.Id == y.Id && x.Date == y.Date; 
    } 

    public int GetHashCode(BaseClass obj) 
    { 
     return obj.GetHashCode(); 
    } 

    #endregion 
} 

然後,只需使用Intersect()和比較器來創建具有不同對象的合併列表。

List<Type1> t1 = new List<Type1>(); 
List<Type2> t2 = new List<Type2>(); 
var combined = t1.Intersect(t2, new BaseClassComparer()); 
+1

難道你不想使用'.Intersect'而不是'.Union'嗎? – recursive

+0

@recursive謝謝! – bit