我现在几个小时都无法解决问题。 这是一个简化的场景。 假设有一个人的列表与他们的出价。我正在尝试找一个出价最高的人并返回名字。我能找到最高出价,但如何输出名称?
List<String[]> list = new List<String[]>();
String[] Bob = { "Alice", "19.15" };
String[] Alice = {"Bob", "28.20"};
String[] Michael = { "Michael", "25.12" };
list.Add(Bob);
list.Add(Alice);
list.Add(Michael);
String result = list.Max(s => Double.Parse(s.ElementAt(1))).ToString();
System.Console.WriteLine(result);
结果我得到28.20,这是正确的,但我需要显示“Bob”。 list.Select()有很多组合,但没有成功。有人请吗?
答案 0 :(得分:9)
从架构的角度来看,最好的解决方案是创建一个单独的类(例如Person),其中包含每个人的两个属性Name和Bid以及包含人员列表的类Persons。
然后您可以轻松使用LINQ命令。
此外,不是将出价存储为字符串,而是将出价作为浮点或小数值更好(或将其存储在美分中并使用int)。
我手边没有编译器,所以它有点让我失望:
public class Person
{
public string Name { get; set; }
public float Bid { get; set; }
public Person(string name, float bid)
{
Debug.AssertTrue(bid > 0.0);
Name = name;
Bid = bid;
}
}
public class Persons : List<Person>
{
public void Fill()
{
Add(new Person("Bob", 19.15));
Add(new Person("Alice" , 28.20));
Add(new Person("Michael", 25.12));
}
}
在你班上:
var persons = new Persons();
persons.Fill();
var nameOfHighestBidder = persons.MaxBy(item => item.Bid).Name;
Console.WriteLine(nameOfHighestBidder);
答案 1 :(得分:5)
您可以使用Jon Skeet's MaxBy.
对于使用情况,您可以看到this question 例如在这种情况下
list.MaxBy(s => Double.Parse(s.ElementAt(1)))[0]
更多here
答案 2 :(得分:5)
这在简单的例子中起作用。不确定真正的
var result = list.OrderByDescending(s => Double.Parse(s.ElementAt(1))).First();
答案 3 :(得分:3)
应该工作:
var max = list.Max(t => double.Parse(t[1]));
list.First(s => double.Parse(s[1]) == max)[0]; // If list is not empty
答案 4 :(得分:2)
找到结果后,只需按以下步骤操作:
list.First(x=>x[1] == result)[0]