2015-07-19 183 views
1

我有两个列表如下检查两个列表包含相同的属性值

var topicsA = new List<Topic>() 
{ 
    new Topic(){ TopicCode = "T01", TopicAccessed = false }, 
    new Topic(){ TopicCode = "T02", TopicAccessed = false }, 
    new Topic(){ TopicCode = "T03", TopicAccessed = false } 
}; 

var topicsB = new List<Topic>() 
{ 
    new Topic(){ TopicCode = "T01"}, 
    new Topic(){ TopicCode = "T02"} 
}; 

什么是topicsATopicAccessed值设置为true的快捷方式,其中TopicCode的属性值是topicsB

相同

例如,在这种情况下T01T02必须TopicAccessed设置为true

问候

+0

更新我的回答与HashSet的 –

回答

5

所有答案都显示二次算法的复杂性(大O)。此代码片段显示线性大O字:

var accessedTopicsByCode = topicsB.ToDictionary(x => x.TopicCode); 
foreach (var t in topicsA) 
{ 
    if (accessedTopicsByCode.ContainsKey(t.TopicCode)) 
    { 
     t.TopicAccessed = true; 
    } 
} 
0

你可以尝试这样的事:

// We iterate though the items of topicsA list. 
foreach(var topicA in topicsA) 
{ 
    // If topicsB list contains any item with the same TopicCode like 
    // the current's item TopicCode, update the TopicAccessed. 
    if(topicsB.Any(x=>x.TopicCode == topicaA.TopicCode)) 
    { 
     topicA.TopicAccessed = true; 
    } 
} 
+0

另一种解决方案这是复杂度高,运算要求的快捷方式。 – CSharpie

+0

这是一个'O(n^2)'复杂性。我不认为这是解决这个问题的最有效方法。另一方面,我不认为这是一个错误的答案,应该被低估。无论如何,这是个人观点。此外,由于耶稣带来了更好的算法,我提高了他的答案,并且我建议OP去接受他的答案...... – Christos

4

使用字典有更好的表现:

var hash = new Dictionary<string,bool>(); 

foreach(var topicB in topicsB) 
{ 
    hash[topicB.TopicCode] = true; 
} 

foreach(var topicA in topicsA) 
{ 
    topicA.TopicAccessed = hash.ContainsKey(topicA.TopicCode); 
} 

的这种解决方案的复杂度为O(N + M),而嵌套循环是O( n * m个)。 ContainsKey的复杂度为O(1)

或者你也可以使用一个HashSet因为我们只需要关键,不是值:

var hash = new HashSet<string>(); 

foreach(var topicB in topicsB) 
{ 
    hash.Add(topicB.TopicCode); 
} 

foreach(var topicA in topicsA) 
{ 
     topicA.TopicAccessed = hash.Contains(topicA.TopicCode); 
} 

此具有相同的复杂性,使用字典,但它的内存使用效率更高。 Contains'复杂度为O(1)

相关问题