如何解决比较C#中数组的值
| 我有一个看起来像这样的布尔数组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]
中的正确值匹配,而在responses[x]
中的错误值应与PersonDetail[x]
中的错误值匹配
解决方法
不能100%确定您的代码,但也许:
var equal = responses.SequenceEqual(Person.PersonDetails.Select(PD => PD.correct);
, 您的代码不清楚,但我想您想执行以下操作:
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在答案之一中指出的那样-如果\“ respons \”和\“ people \”的长度不同,会发生什么...希望下面的内容有所帮助
class Program
{
static void Main(string[] args)
{
bool[] responses = new bool[] { true,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,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,它以更易读的方式执行相同的操作。代码已更改,以匹配其他所有人已经回答的内容...]。
, 您也可以尝试如下操作:
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。