比较C#中数组的值
本文关键字:数组 比较 | 更新日期: 2023-09-27 17:59:15
我有一个bool数组,看起来像这个
bool[] responses = new bool[] {true, false, true};
还有两个类,看起来像这样:
public class Person {
public IList<PersonDetail> PersonDetails
}
public class PersonDetail {
public bool Correct { get; set; }
}
PersonDetails
>> PersonDetail[0].correct = true
>> PersonDetail[1].correct = true
>> PersonDetail[2].correct = false
有没有一种简单的方法可以比较这些,看看每种方法的真/假是否相等?我试图使用c#.SequenceEqual
,但我不知道如何从PersonDetail类转换为序列xxx,我可以用它来与响应进行比较。
到目前为止,我拥有的是:
var equal = responses.Select(bool.Parse).SequenceEqual( xxx );
我需要做的是比较以下内容:
responses[0] == PersonDetail[0].correct and
responses[1] == PersonDetail[1].correct and
responses[2] == PersonDetail[2].correct
因此,responses[x]
中的true在PersonDetail[x]
中应该匹配true,responses[x]
中的false在PersonDetail[x]
中应该匹配false
您的代码不是很清楚,但我想您需要执行以下操作:
var isEqual = responses.SequenceEqual(PersonDetail.Select(p=>p.Correct))
您可以像这样使用SequenceEqual
var responses = new [] { true, false, true };
var details = new List<PersonDetail>()
{ new PersonDetail() {Correct = true},
new PersonDetail() {Correct = false},
new PersonDetail() {Correct = true} };
var person = new Person() { PersonDetails = details };
var equal = responses.SequenceEqual(person.PersonDetails.Select(pd => pd.Correct));
根据已经给出的答案,我进行了一次尝试,并提出了以下内容,似乎奏效了——请注意,我也是C#的新手,所以这是一个有趣的问题。
正如JonB在其中一个答案中指出的那样——如果"反应"answers"人"的长度不同,会发生什么。。。希望以下内容能帮助
class Program
{
static void Main(string[] args)
{
bool[] responses = new bool[] { true, false, true };
Person people = new Person();
people.PersonDetails.Add(new PersonDetail() { Correct = true });
people.PersonDetails.Add(new PersonDetail() { Correct = false });
people.PersonDetails.Add(new PersonDetail() { Correct = true });
bool equal = responses.SequenceEqual(people.PersonDetails.Select(P=> P.Correct));
Console.WriteLine (equal);
}
}
public class Person
{
public List<PersonDetail> PersonDetails = new List<PersonDetail>();
}
public class PersonDetail
{
public bool Correct;
}
如果我读对了你的问题,这个LINQ会按照你的要求执行。我不确定它是否比简单的foreach循环更可读,但这不是重点!
public class Person
{
public IList<PersonDetail> PersonDetails;
}
public class PersonDetail
{
public bool Correct;
}
void Main()
{
bool[] responses = new bool[] {true, false, true};
Person p = new Person();
p.PersonDetails = new List<PersonDetail>();
p.PersonDetails.Add(new PersonDetail(){Correct = true});
p.PersonDetails.Add(new PersonDetail(){Correct = true});
p.PersonDetails.Add(new PersonDetail(){Correct = false});
//bool allGood = p.PersonDetails.Select((pd, index) => pd.Correct == responses[index]).All(x => x==true);
bool allGood = responses.SequenceEqual(p.PersonDetails.Select(x => x.Correct));
allGood.Dump(); // LINQpad extension
}
[edit-好的,所以现在还为时过早,我忘记了SequenceEquals,它以更可读的方式做同样的事情。代码更改为匹配其他人已经回答的内容…]。
不能100%确定您的代码,但可能:
var equal = responses.SequenceEqual(Person.PersonDetails.Select(PD => PD.correct);
您也可以尝试以下操作:
IEnumerable<bool> answers = from x in Person.PersonDetails select x.correct;
bool equal = responses.SequenceEqual(answers)
没有比以下更简单的了:-
if (person.PersonDetails.Count != responses.Length)
throw new ArgumentOutOfRangeException("Arrays are different lengths");
bool result = true;
for (int i = 0; i < person.PersonDetails.Count; i++)
{
if (person.PersonDetails[i].Correct != responses[i])
{
result = false;
break;
}
}
这个星球上的每一个程序员都能阅读它,即使他们从未见过c#。
实际上,它突出了规范中缺失的一个方面;如果列表的长度不同,该怎么办?
对这些项使用XOR,而不是and或or运算。如果两个项相同,XOR表将给您0。