[英]Comparing values of arrays in C#
我有一个看起来像这样的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]
中的真实情况应该在PersonDetail[x]
匹配true,而在responses[x]
中的false应该在PersonDetail[x]
匹配false
你的代码不是很清楚,但我想你想要做以下事情:
var isEqual = responses.SequenceEqual(PersonDetail.Select(p=>p.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
}
[编辑 - 好的,所以现在还早,我忘记了SequenceEquals,它以更易读的方式做同样的事情。 代码已更改为与其他人已经回答的内容相匹配...]。
您可以像这样使用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在其中一个答案中指出的那样 - 如果“回应”和“人”的长度不同,会发生什么......希望以下有助于
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;
}
不是100%肯定你的代码,但可能:
var equal = responses.SequenceEqual(Person.PersonDetails.Select(PD => PD.correct);
对这些项目使用XOR而不是AND或OR操作。 如果两个项目相同,XOR表将给出0。
没有比以下简单得多: -
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#,地球上的每个程序员都能够阅读它。
实际上它突出了规范的缺失方面; 如果列表长度不同会怎么样?
你也可以尝试这样的事情:
IEnumerable<bool> answers = from x in Person.PersonDetails select x.correct;
bool equal = responses.SequenceEqual(answers)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.