C# Linq使用max选择单个值
如何获取属性ID 3?有没有一种方法可以将结果转换为ContaC# Linq使用max选择单个值,c#,.net,linq,C#,.net,Linq,如何获取属性ID 3?有没有一种方法可以将结果转换为Conta List<Conta> contas = new List<Conta>(); contas.Add(new Conta { ID = 1, Saldo = 30 }); contas.Add(new Conta { ID = 2, Saldo = 50 }); contas.Add(new Conta { ID = 3, Saldo = 100 }); var result = contas.Where
List<Conta> contas = new List<Conta>();
contas.Add(new Conta { ID = 1, Saldo = 30 });
contas.Add(new Conta { ID = 2, Saldo = 50 });
contas.Add(new Conta { ID = 3, Saldo = 100 });
var result = contas.Where(c => c.Saldo == contas.Max(l => l.Saldo)) ;
List contas=new List();
Add(新Conta{ID=1,Saldo=30});
Add(新Conta{ID=2,Saldo=50});
Add(新Conta{ID=3,Saldo=100});
var result=contas.Where(c=>c.Saldo==contas.Max(l=>l.Saldo));
如果只需要一个结果,请使用Single()
或First()
:
var result = contas.FirstOrDefault(c => c.Saldo == contas.Max(l => l.Saldo));
这将返回具有最大Saldo的Conta
对象。如果只需要一个结果,请使用Single()
或First()
:
var result = contas.FirstOrDefault(c => c.Saldo == contas.Max(l => l.Saldo));
var max = Users.OrderByDescending(x => x.Saldo).FirstOrDefault();
这将返回具有最大Saldo的
Conta
对象。而不是使用。其中()
使用Single()
var max = Users.OrderByDescending(x => x.Saldo).FirstOrDefault();
如果结果中有0个或多个元素,Single
将引发异常
如果结果中有多个元素,SingleOrDefault
将引发异常
如果没有结果,First
将抛出(列表为空)
如果列表为空,FirstOrDefault
将抛出。而不是使用。其中()
使用Single()
/SingleOrDefault()
/First()
/FirstOrDefault()
如果结果中有0个或多个元素,Single
将引发异常
如果结果中有多个元素,SingleOrDefault
将引发异常
如果没有结果,First
将抛出(列表为空)
如果列表为空,FirstOrDefault
将抛出。是否需要MaxBy()
扩展方法
一旦有了这些,解决方案就变得简单:
List<Conta> contas = new List<Conta>();
contas.Add(new Conta { ID = 1, Saldo = 30 });
contas.Add(new Conta { ID = 2, Saldo = 50 });
contas.Add(new Conta { ID = 3, Saldo = 100 });
var result = contas.MaxBy(x => x.Saldo);
Console.WriteLine(result.ID);
List contas=new List();
Add(新Conta{ID=1,Saldo=30});
Add(新Conta{ID=2,Saldo=50});
Add(新Conta{ID=3,Saldo=100});
var result=contas.MaxBy(x=>x.Saldo);
Console.WriteLine(result.ID);
以下是MaxBy()的示例实现(这归功于Jon Skeet等人):
公共静态类EnumerableText
{
公共静态TSource MaxBy(此IEnumerable源,Func选择器)
{
返回source.MaxBy(选择器、比较器、默认值);
}
公共静态TSource MaxBy(此IEnumerable源、Func选择器、IComparer比较器)
{
使用(IEnumerator sourceIterator=source.GetEnumerator())
{
如果(!sourceIterator.MoveNext())
{
抛出新的InvalidOperationException(“序列为空”);
}
TSource max=sourceIterator.Current;
TKey maxKey=选择器(最大值);
while(sourceIterator.MoveNext())
{
TSource candidate=sourceIterator.Current;
TKey candidateProjected=选择器(候选者);
if(comparer.Compare(candidateProjected,maxKey)>0)
{
max=候选人;
maxKey=候选项目;
}
}
返回最大值;
}
}
}
您需要一个MaxBy()
扩展方法
一旦有了这些,解决方案就变得简单:
List<Conta> contas = new List<Conta>();
contas.Add(new Conta { ID = 1, Saldo = 30 });
contas.Add(new Conta { ID = 2, Saldo = 50 });
contas.Add(new Conta { ID = 3, Saldo = 100 });
var result = contas.MaxBy(x => x.Saldo);
Console.WriteLine(result.ID);
List contas=new List();
Add(新Conta{ID=1,Saldo=30});
Add(新Conta{ID=2,Saldo=50});
Add(新Conta{ID=3,Saldo=100});
var result=contas.MaxBy(x=>x.Saldo);
Console.WriteLine(result.ID);
以下是MaxBy()的示例实现(这归功于Jon Skeet等人):
公共静态类EnumerableText
{
公共静态TSource MaxBy(此IEnumerable源,Func选择器)
{
返回source.MaxBy(选择器、比较器、默认值);
}
公共静态TSource MaxBy(此IEnumerable源、Func选择器、IComparer比较器)
{
使用(IEnumerator sourceIterator=source.GetEnumerator())
{
如果(!sourceIterator.MoveNext())
{
抛出新的InvalidOperationException(“序列为空”);
}
TSource max=sourceIterator.Current;
TKey maxKey=选择器(最大值);
while(sourceIterator.MoveNext())
{
TSource candidate=sourceIterator.Current;
TKey candidateProjected=选择器(候选者);
if(comparer.Compare(candidateProjected,maxKey)>0)
{
max=候选人;
maxKey=候选项目;
}
}
返回最大值;
}
}
}
可能的重复将是O(N^2)。。。至少获取Where()
可能重复的值以外的最大值,该值将是O(N^2)。。。至少获取Where()之外的最大值。