2015-02-06 60 views
-1

我是C#的新手,并且在各处搜索了此内容,但如果已经询问,找不到答案。我试图用一个for循环来比较两个列表:在两个列表中发现不同的匹配<string>

IList<string> List1 = new List<string> { usr.User1, usr.User2, usr.User3, usr.User4 }; 

IList<string> List2 = new List<string>{ "Tim", "Bob", "Brian", "Paul" }; 

基本上我想那里只有4点可能的匹配,所以只有这些可能的匹配应该算:

usr.User1 == "Tim", // e.g. User1 has to be Tim etc. 
usr.User2 == "Bob", 
usr.User3 == "Brian", 
usr.User4 == "Paul" 

我将理想喜欢用0-4的值返回一个int,因此,如果所有的比赛的上面有成功,那么它将返回4,如果没有成功匹配则返回0等

我曾尝试:

int score = 0; 

for (int i = 0; i <= List2.Count; i++) 
{ 
    if (List1[i] == List2[i]) 
    { 
     score++; 
    } 
} 

但目前正在取得IndexOutOfRangeException。非常感谢。

+0

异常的原因是'<= List2.Count'。如果count为4,则有效索引值为0,1,2和3. – 2015-02-06 16:27:25

+0

@ User9876867欢迎使用堆栈溢出。您的问题非常接近[XY问题](http://meta.stackexchange.com/a/66378/171858)。在你的例子中,你正在问如何使用不仅不需要的[tag:for-loop]来完成它,但是有更好的方法来解决实际问题,这很简单*如何通过索引匹配列表中的值*。 – 2015-02-06 16:33:56

+0

嗨我被告知使用for循环,因为它更具人性化可读性和可调试性。 – 2015-02-06 16:38:31

回答

5

删除=,你想要停止上限。

for (int i = 0; i < List2.Count; i++) 

另一种选择是使用zip linq

int score = List1.Zip(List2, (a,b) => a == b ? 1 : 0).Sum(); 
+0

这看起来很熟悉:http://stackoverflow.com/questions/28355314/linq-query-to-compare-2-liststring-for-distinct-matches/28355379#28355379 – itsme86 2015-02-06 16:35:38

+1

这是值得注意的(看起来好像海报是新的到C#)集合是基于'0'的。 'Count'属性是基于'1'的。 – Cameron 2015-02-06 16:42:16

+0

@ itsme86纯粹的巧合。伟大的思想和所有的! – weston 2015-02-06 17:23:03

2

输掉=它应该是for (int i = 0; i < List2.Count; i++)

虽然可能有更好的方法。

0

由于List2有4个元素,当你做出i <= List2.Count语句for循环List2.Count将eqal到4

,你允许循环索引0-4,因为列表是0索引基础,当循环得到索引4时,会抛出一个IndexOutOfRangeException异常。

解决方法是将for循环中的<=语句更改为<

+0

欢迎来到StackOverflow。您可能想查看[格式指南](http://stackoverflow.com/help/formatting)。这将帮助您的问题和答案看起来更好,最终变得更有帮助。另外,我们强烈建议使用其他人发布的“完整”答案。 :) – Cameron 2015-02-06 16:38:53

+0

谢谢@Cameron,我会采取你的建议。 – 2015-02-06 17:14:38