2013-08-29 69 views
-1

我編輯我的帖子,因爲假設3方法返回數據庫表中的行 表是:docTags,標記和文檔docTags是中間表 一個文檔(文檔)可以有多個標籤和一個標籤可以屬於許多文檔 我怎麼能得到:TagKey =「123」其中docTags.Add(新配置(1,1)); 類節目 {相交兩個列表<>

static void Main(string[] args) 
    { 

    } 
} 

public class Configuration 
{ 
    public int DocID { get; set; } 
    public int TagID { get; set; } 
    public string Name { get; set; } 
    public string DocKey { get; set; } 
    public string TagKey { get; set; } 

    public Configuration(int _docId,string _name, string _docKey) 
    { 
     DocID = _docId; 
     Name = _name; 
     DocKey = _docKey; 
    } 
    public Configuration(int _tagId,string name, string _dockey,string _tagKey) 
    { 
     TagID = _tagId; 
     Name = name; 
     TagKey = _tagKey; 
    } 
    public Configuration(int _tagId, int _docId) 
    { 
     TagID = _tagId; 
     DocID = _docId; 
    } 
    public static List<Configuration> getDocType() 
    { 
     List<Configuration> docs = new List<Configuration>(); 
     docs.Add(new Configuration(1,"contract", "xxx")); 
     docs.Add(new Configuration(2,"Action", "yyy")); 
     return docs; 
    } 

    public static List<Configuration> getTagName() 
    { 
     List<Configuration> tags = new List<Configuration>(); 
     tags.Add(new Configuration(1,"contractid", "123")); 
     tags.Add(new Configuration(2,"SuperDuper", "332123")); 
     tags.Add(new Configuration(22, "rama", "yyy")); 
     tags.Add(new Configuration(32, "aktiv", "123456")); 
     tags.Add(new Configuration(42, "data ","xx764fhx")); 
     return tags; 

    } 
    public static List<Configuration> getDocTags() 
    { 
     List<Configuration> docTags = new List<Configuration>(); 
     docTags.Add(new Configuration(1, 2)); 
     docTags.Add(new Configuration(1, 1)); 
     docTags.Add(new Configuration(1, 22)); 
     docTags.Add(new Configuration(2, 2)); 
     docTags.Add(new Configuration(2, 32)); 
     return docTags; 
    }   
} 

}

+8

爲什麼「沒有擴展方法」? LINQ是做這件事的顯而易見的方法。 –

+0

好,但如何做到這一點? – Krasimir

回答

5

你想要一個Join

var commonUsers = (from t in tags 
        join d in docs on t.DocKey equals d.DocKey 
        select t) 
        .Distinct(); // to remove duplicates 

或者另一種方式

var commonUsers = tags.Where(t => docs.Any(d => d.DocKey == t.DocKey)); 

第二種方法是短,但第一個可能會表現得更好。

+0

如果文檔有兩個或多個相同的'DocKey',則第一個可能會給你重複的結果。 –

+0

兩者都是固定的。謝謝。 –

0

可以在過濾器上使用Contains方法和應用它與lambda表達式來提取從一個列表中的項目在另一個使用一個或多個條件,樣品:

var result = needThis.Where(x => needThis2.Contains(x)).ToList(); 

或者使用擴展方法Intersect,樣品:

var result = needThis.Intersect(needThis2); 
1
var newList = docs.Intersect(tags); 

您可能需要覆蓋Equals運算符才能使其工作。

+1

或者您可以使用採用「IEqualityComparer」(http://msdn.microsoft.com/zh-CN/library/bb355408.aspx) – hvd

+1

的'Intersect'重載,除非定義了「配置」的相等性,否則這將不起作用OP所要求的方式(比較'DocKey') –

1

這裏是你如何使用Intersect來做到這一點,而不會重載Equals方法。您需要創建一個新的類,然後通過爲IEqualityComparer

class ConfigurationComparer : IEqualityComparer<Configuration> 
{ 
    //You can change which string comparer fits your needs best. 
    private readonly StringComparer comparer = StringComparer.CurrentCulture; 

    public bool Equals(Configuration x, Configuration y) 
    { 
     return comparer.Equals(x.DocKey,y.DocKey); 
    } 

    public int GetHashCode(Configuration obj) 
    { 
     return comparer.GetHashCode(obj.DocKey); 
    } 

} 

你根本

var newList = tags.Intersect(docs, new ConfigurationComparer()); 
相關問題