繁体   English   中英

比较C#中的数组值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM