2015-11-16 27 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);