私はこれがあなたのために働くと思います。
public static IQueryable<T> TopPercentWithTies<T, TKey>(this IOrderedQueryable<T> query, Expression<Func<T, TKey>> groupByExpression, double percent)
{
var groupedQuery = query.GroupBy(groupByExpression);
int numberToTake = groupedQuery.Count() * percent/100;
return groupedQuery.Take(numberToTake).SelectMany(t => t);
}
私はIEnumerableでテストしたので、IQueryableで正しく動作するかどうかはわかりません。 TopPercentWithTies()を呼び出す前にリストをソートしました。
これは私がそれをテストするために使用したコードです。
int percent = 50;
var people = new []
{
new { Age = 99, Name = "Adam" },
new { Age = 99, Name = "Andrew" },
new { Age = 89, Name = "Bob" },
new { Age = 50, Name = "Cecil" },
new { Age = 50, Name = "Doug" },
new { Age = 50, Name = "Everett" },
new { Age = 35, Name = "Frank" },
new { Age = 25, Name = "Greg" },
new { Age = 15, Name = "Hank" }
};
var sortedPeople = people.AsQueryable().OrderByDescending(person => person.Age);
var results = sortedPeople.TopPercentWithTies(person => person.Age, percent);
foreach (var person in results)
Console.WriteLine(person);
希望するか、少なくとも正しい方向に向けることを望みます。 numberToTakeを計算するためのロジックを調整することができます。
非常にいいです。私はそれがIOrderedQueryableの拡張であると期待しています。 – Maslow
ああ甘い。私はIOrderedQueryableについて知らなかった。私はコードを更新しました。 – Ecyrb
これは、T-SQLの 'TOP n PERCENT WITH TIES'のような結果をもたらさないように見えます。 5050エントリを有するデータ「1 2 2 3 3 3 4 4 4 4 ... 100」を考える。 'TOP 1 PERCENT WITH TIES'は55行(値 '10'まで)を返しますが、関数は1行しか返しません。 –