比较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

比较C#中数组的值

您的代码不是很清楚,但我想您需要执行以下操作:

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。