0

私は現在 C# で LINQ を学んでMax()おり、LINQ ステートメントで関数を使用してオブジェクトを返すより良い方法があるかどうか疑問に思っていました。

ここに私のユーザークラスがあります:

public class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double MonthlyWage { get; set; }
    }

これは私のテーブル人口クラスです:

public class UsersTable
    {
        public IList<User> Populate()
        {
            IList<User> Users = new List<User>()
            {
                new User{ID = 1, Name = "Bob", MonthlyWage = 1200.00},
                new User{ID = 2, Name = "Lee", MonthlyWage = 2200.00},
                new User{ID = 3, Name = "Dan", MonthlyWage = 3200.00},
                new User{ID = 4, Name = "Liam", MonthlyWage = 4200.00},
                new User{ID = 5, Name = "Danny", MonthlyWage = 4213.00},
                new User{ID = 6, Name = "Jonathan", MonthlyWage = 1222.00},
                new User{ID = 7, Name = "Martin", MonthlyWage = 1233.00},
                new User{ID = 8, Name = "Dec", MonthlyWage = 9999.99}
            };
            return Users;
        }
    }

これが Main メソッドです。

class Program
    {
        static void Main(string[] args)
        {
            UsersTable UserTable = new UsersTable();
            IList<User> Users = UserTable.Populate();

            double max = Users.Max(x => x.MonthlyWage);
            var maxMonthlyWage = Users
                .Where(m => m.MonthlyWage == max)
                .Select(x => x);

            foreach (var item in maxMonthlyWage)
            {
                Console.WriteLine("{0}: {1} {2} MAX", item.ID, item.Name, item.MonthlyWage);
            }

            Console.ReadLine();
    }

月給が最大のユーザーをdouble max事前に作成せずに返却する方法はありますか?これは、このタイプのクエリを実行するための最良の方法ですか?

4

2 に答える 2

4

一発ギャグ

  var item = Users.OrderByDescending(x => x.MonthlyWage).FirstOrDefault();

  if(item != null)
    Console.WriteLine("{0}: {1} {2} MAX", item.ID, item.Name, item.MonthlyWage);

  Console.ReadLine();

すべての上位の収益が必要な場合:

var wageGroups = from u in Users
                group u by u.MonthlyWage into ug
                orderby ug.Key descending
                select new { MonthlyWage = ug.Key, Users = ug.ToList() };

var topEarners = wageGroups.First().Users;

foreach (var item in topEarners)
{
    Console.WriteLine("{0}: {1} {2} MAX", item.ID, item.Name, item.MonthlyWage);
}

Console.ReadLine();
于 2013-09-12T14:19:57.133 に答える
1

すべてをまとめることができます:

var maxMonthlyWage = Users
                    .OrderByDescending(x => x.MonthlyWage)
                    .TakeWhile(x => x.MonthlyWage == Users.Max(y => y.MonthlyWage))
                    .ToList();

注:中間変数を削除するというOPの懸念に答えました(いくつかの冗長ビットも削除しました)。いずれにせよ、誤解されたくありません。提案されたアプローチは、効率の観点からは OP のアプローチよりも優れているわけではありません。

注 2: MarcinJuraszek によって強調されているように、このクエリは分析を 2 回実行します。彼はそれを避けるために外部ライブラリを提案しています ( moreLINQ)。他のオプションはFirst(Tommy Grovnes によって提案されたように) に依存している可能性がありますが、これは 1 つの結果しか提供しません (OP が探しているとは考えにくい)。

注 3: MarcinJuraszek によって正しく強調されているように、元の OP のコードは最大値を計算するために 1 回だけ反復されます。私の答えの新しいバージョン(最初のものよりも優れています)は、まだ複数回繰り返されるため、元のバージョンよりも効率的ではありません。それにもかかわらず、OPは中間変数の削除を要求しました。これがこの回答の理由です。

于 2013-09-12T14:14:21.317 に答える