4

ここ数時間、問題を解決できません。これは単純化されたシナリオです。入札した人のリストがあるとしましょう。最高入札者を見つけて名前を返そうとしています。最高入札額はわかりましたが、名前はどうやって出力するのですか?

        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() には非常に多くの組み合わせがありましたが、成功しませんでした。どなたかお願いします。

4

5 に答える 5

9

アーキテクチャの観点からの最善の解決策は、各人物の Name と Bid の 2 つのプロパティと、人物のリストを含む Persons クラスを含む別のクラス (Person など) を作成することです。

その後、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);
于 2012-08-15T13:32:01.533 に答える
5

Jon Skeet の MaxByを使用できます。

使用法については、この質問を見ることができます。 たとえば、この場合

list.MaxBy(s => Double.Parse(s.ElementAt(1)))[0]

詳細はこちら

于 2012-08-15T13:31:02.680 に答える
5

これは単純な例で機能します。本物かどうかは不明

var result = list.OrderByDescending(s => Double.Parse(s.ElementAt(1))).First();
于 2012-08-15T13:33:52.910 に答える
3

動作するはずです:

var max = list.Max(t => double.Parse(t[1]));
list.First(s => double.Parse(s[1]) == max)[0]; // If list is not empty
于 2012-08-15T13:34:12.627 に答える
2

結果を見つけたら、次のようにします。

list.First(x=>x[1] == result)[0]
于 2012-08-15T13:32:31.897 に答える