C# 相互减去列表中的两个属性

C# 相互减去列表中的两个属性,c#,C#,我想得到两个整数之间的差,在这个例子中是“年龄”——减去它们 这是我的班级和名单。我想用一种方法,从罗宾和莎拉身上取下年龄,并显示年龄差异。使用LINQ或..可以实现这一点吗 public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } } public class LinqQuer

我想得到两个整数之间的差,在这个例子中是“年龄”——减去它们

这是我的班级和名单。我想用一种方法,从罗宾和莎拉身上取下年龄,并显示年龄差异。使用LINQ或..可以实现这一点吗

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

public class LinqQuery
{
    private readonly List<Person> _persons = new List<Person>
    {
        new Person {FirstName = "Robin", LastName = "Blixt", Age = 29},
        new Person {FirstName = "Sara", LastName = "Johansson", Age = 44}
    };

    public IEnumerable<Person> GetAll()
    {
        return _persons;
    }

    public void difference()
    {
        ?????
        Console.ReadKey();
    }
}
公共类人物
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共整数{get;set;}
}
公共类LinqQuery
{
私人只读列表_persons=新列表
{
新人{FirstName=“Robin”,LastName=“blix”,年龄=29},
新人{FirstName=“Sara”,LastName=“Johansson”,年龄=44}
};
公共IEnumerable GetAll()
{
返回人员;
}
公共空间差异()
{
?????
Console.ReadKey();
}
}

提前谢谢

谢谢,@Tim Schmelter的建议:)


如果FirstName是您的键,并且您有两个以上的项,则可以使用lambda表达式来查找指定的索引。 请注意,我没有检查任何错误(空列表等)


使用交叉连接可以计算列表中所有排列的年龄差异

当然,这是非常粗糙的,会给出所有重复项,但是从那里很容易删除查询中的重复项

public void Difference()
{
    var ageDifferences = from p1 in _persons
                         from p2 in _persons
                         select new
                         {
                             P1FullName = p1.FirstName + " " + p1.LastName,
                             P2FullName = p2.FirstName + " " + p2.LastName,
                             AgeDifference = Math.Abs(p1.Age - p2.Age)
                         };

    foreach (var item in ageDifferences)
    {
        Console.Out.WriteLine("{0} and {1} have {2} years of age difference.", item.P1FullName, item.P2FullName, item.AgeDifference);
    }

    Console.ReadKey();
}

你为什么要用Linq来做这个?@Rytmis,这正是我的想法!当列表有三项时会发生什么?四个怎么样?五岁?这归结为问一个问题:除了两个人之外,你如何定义“年龄差异”呢?一个确切的例子是什么?思考您试图解决的问题?-)嗯,丑陋是可以的,但它不会编译。这不会编译,因为您的
Select
s的结果都是
IEnumerable
,而不仅仅是
int
。OTOH,如果您使用
Single
First
或它们的
或default
对应项,如果列表中存在多个同名的人,您将得到一个
InvalidOperationException
。谢谢,伙计们。发帖前我没有检查。原谅我的愚蠢。我已经更新了答案。此外,这是对OP问题的直接回答,因此我没有考虑列表中是否存在多个具有这些姓名的人。@Rytmis
First
FirstOrDefault
如果找到多个,则不会引发任何异常。它只是返回第一个。这仍然是不正确的。你可以使用它的副本。FirstOrDefault需要谓词,而不是int。
 public void diff() 
    { 

                int indxRobin = lst.FindIndex((item) => { return item.FirstName == "Robin"});
                int indxSara =  lst.FindIndex((item) => { return item.FirstName == "Sara"});

                return lst[indxRobin].Age - lst[indxSara].Age;
    }
public void Difference()
{
    var ageDifferences = from p1 in _persons
                         from p2 in _persons
                         select new
                         {
                             P1FullName = p1.FirstName + " " + p1.LastName,
                             P2FullName = p2.FirstName + " " + p2.LastName,
                             AgeDifference = Math.Abs(p1.Age - p2.Age)
                         };

    foreach (var item in ageDifferences)
    {
        Console.Out.WriteLine("{0} and {1} have {2} years of age difference.", item.P1FullName, item.P2FullName, item.AgeDifference);
    }

    Console.ReadKey();
}