C# 相互减去列表中的两个属性
我想得到两个整数之间的差,在这个例子中是“年龄”——减去它们 这是我的班级和名单。我想用一种方法,从罗宾和莎拉身上取下年龄,并显示年龄差异。使用LINQ或..可以实现这一点吗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
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问题的直接回答,因此我没有考虑列表中是否存在多个具有这些姓名的人。@RytmisFirst
和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();
}