2015-11-16 28 views
0

我試圖檢查2個字符串列表的相等性,但它不工作。這是我做了什麼:檢查foreach循環中列表的相等性 - C#

foreach (List<string> q in questions) 
{ 
     if (!groupOfQuestions.Except(q).Any()) //I also tried without '!' 
     { 
      questions.Add(groupOfQuestions); 
     } 
} 

和申報清單:

List<List<string>> questions = new List<List<string>>(); 
List<string> groupOfQuestions = new List<string>(); 
+6

什麼意思是「它」不工作「? **編輯**我看,你想在枚舉期間修改集合,這是不允許的。你能解釋你真正想做什麼,也許有更好的方法。期望的結果是什麼? –

+0

您是否試圖檢查兩個字符串列表是否包含所有相同的值? – timothyclifford

+0

我試圖檢查2個字符串列表是否包含相同的字符串,無論順序如何 – PeMaCN

回答

1

不能的foreach循環內修改集合,但你可以爲循環做在

for (int i = questions.Count - 1; i >= 0; --i) { 
    List<string> q = questions[i]; 

    if (!groupOfQuestions.Except(q).Any()) //I also tried without '!' 
     questions.Add(groupOfQuestions); 
    } 

另一種可能收藏複製

// Note ".ToList()" 
    foreach (List<string> q in questions.ToList()) 
    if (!groupOfQuestions.Except(q).Any()) //I also tried without '!' 
     questions.Add(groupOfQuestions); 
+0

第二種解決方案適合我,但這樣會多次添加groupOfQuestions,因爲問題中已經有不同的字符串列表。我怎樣才能讓它只添加一次。 – PeMaCN

0

你的問題是在這條線:

questions.Add(groupOfQuestions); 

不能修改的集合,而你是遍歷它。

您將需要創建一個新的List<List<string>>,您可以將匹配添加到。例如:

  var questions = new List<List<string>> { 
       new List<string>{"aaa", "bbb", "ccc"}, 
       new List<string>{"aaa", "bbb", "ddd"}, 
      }; 
      var groupOfQuestions = new List<string>() { "ddd" }; 
      var questionMatches = new List<List<string>>(); 

      foreach (List<string> q in questions) 
      { 
       if (!groupOfQuestions.Except(q).Any()) //I also tried without '!' 
       { 
        questionMatches.Add(groupOfQuestions); 
       } 
      } 
+0

確實如此,但解決方案是什麼? –

+0

嗨@TimSchmelter,謝謝,我已經添加了一個解決方案。 –

0

questions在foreach迭代時不能被修改。建立一個新的列表,並在結束時運行AddRange

var listsToAdd = new List<List<string>>(); 

foreach (List<string> q in questions) 
{ 
    if (!groupOfQuestions.Except(q).Any()) 
    { 
     questions.Add(groupOfQuestions); 
    } 
} 

questions.AddRange(listsToAdd);