Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C LINQ过滤列表_C#_Linq - Fatal编程技术网

C# C LINQ过滤列表

C# C LINQ过滤列表,c#,linq,C#,Linq,这是我第一次使用LINQ,但我还没有真正理解它 我试图通过一个例子来理解它,但我需要一些帮助 我创建了一个类人: class Person { private string name { get; set; } private int age { get; set; } private bool parent { get; set; } private bool child { get; set; } public Person(string name,

这是我第一次使用LINQ,但我还没有真正理解它

我试图通过一个例子来理解它,但我需要一些帮助

我创建了一个类人:

class Person
{
    private string name { get; set; }
    private int age { get; set; }
    private bool parent { get; set; }
    private bool child { get; set; }

    public Person(string name, int age, bool parent, bool child)
    {
        this.name = name;
        this.age = age;
        this.parent = parent;
        this.child = child;
    }
}
我创建了一个人员列表:

people.Add(new Person("Joel", 12, false, true));
        people.Add(new Person("jana", 22, false, false));
        people.Add(new Person("Stefan", 45, true, false));
        people.Add(new Person("Kurt", 25, false, false));
        people.Add(new Person("Sebastian", 65, true, false));
        people.Add(new Person("George", 14, false, true));
        people.Add(new Person("Noel", 50, true, false));
现在我想把每一个被设定为父母的人都带出去。 但我被困在这里:

var parents = people.Where()

linq语句应该是

var parents = people.Where(x => x.parent);
并将私有bool父对象{get;set;}更改为公共bool父对象{get;set;}

虽然可能需要一点时间才能理解,但语法非常简单,使用起来非常方便。请记住,“where”用作过滤器,“select”用作投影。请记住,您需要使属性公开可见。如果你愿意,你可以把二传员保密。您甚至可以引入一个方法来检查父级是否存在,并在lambda中调用它

假设您的person类更复杂

class Person
{
    public string name { get; private set; }
    public int age { get; private set; }
    public Person parent { get; private set; }
    public bool child { get; private set; }

    public bool HasParent()
    {
        return parent != null;
    }

    public Person(string name, int age, Person parent, bool child)
    {
        this.name = name;
        this.age = age;
        this.parent = parent;
        this.child = child;
    }
}
您可以执行类似的操作来获取表示所有父对象的person对象列表:

var parents = people.Where(x => x.parent != null).Select(x => x.parent).ToList();

您也不需要使用“x”,并且此字母仅在每个条款的范围内;甚至可以按年龄排列这些父母:

var parents = people.Where(y => y.HasParent()).Select(z => z.parent).OrderBy(x => x.age).ToList();
也许您希望从上述集合中获取最年长的父项:

var oldestParent = parents.OrderByDescending(x => x.age).FirstOrDefault();

if (oldestParent != null)
{
    Console.WriteLine($"{oldestParent.name} is the oldest, at {oldestParent.age}");
}
您可以在查询中组合多个检查:

var parentsOfPeopleWithChildren = people.Where(x => x.parent != null && x.child).Select(x => x.parent).ToList();
还记得在C中,通常将属性的第一个字母大写。例如:

public bool Child { get; private set; }
LINQ非常直截了当:

var query = people.Where(x => x.parent);
但是,您的父级可能由于其访问修饰符而无法访问

如果您不希望在声明后从外部对其进行更改,这可能就是您通过构造函数的参数声明属性的原因。我建议您使用public{get;private set;}


var parents=people.Wherep=>p.parent;将返回父属性为true的所有结果。在这种情况下,parent是bool类型,您可以在不使用==或Equals的情况下对其求值,但是,对于非布尔属性,您应该使用相等比较。您需要将属性设置为public。好的,我想我应该使用它,因为Person类的所有属性都设置为private。如果我想保持这样呢?是否也有解决方案?但是谢谢@Toast先生,您可以将其公开为只读属性public bool parent{get;private set;}。通过这种方式,您可以查看此人是否为家长,但不能对其进行变异。@Mr.Toast no您至少需要读取您要筛选的财产的访问权限感谢此详细描述!非常有用没问题。我记得当我第一次学习林克和兰姆达时,我很挣扎;对我来说更容易的是使用了一个名为ReSharper的VisualStudio附加组件。它在业界非常流行,虽然一开始使用它会感到有点不舒服,但它会为您提供更好的代码编写方法,通常利用LINQ,并使您成为一名更好的开发人员。如果你是一名学生,请访问JetBrain的网站,免费获取一年,否则请尝试30天试用期。我已经在使用它了:好奇地想看看它对LINQ和Lambda能做些什么!写一些foreach循环,看看它有什么建议:
public bool Child { get; private set; }
var query = people.Where(x => x.parent);
class Person
{
    public string name { get; private set; }
    public int age { get; private set; }
    public bool parent { get; private set; }
    public bool child { get; private set; }

    public Person(string name, int age, bool parent, bool child)
    {
        this.name = name;
        this.age = age;
        this.parent = parent;
        this.child = child;
    }
}