-1

我有一个 Job 对象的内存列表,如果 Job 对象有一个名为 Salary 的属性。

如何使用 LINQ 或 C# 过滤此列表以仅包含薪水在前 10 或后 10 个百分位数的工作列表?

这是我的尝试,到目前为止似乎对我有用:

var tenthPercentileCount = allJobsCount / 10;
var top10PercentileJobs = allJobs
    .OrderByDescending(j => j.Salary.SalaryAmount)
    .Take(tenthPercentileCount)
    .ToList();
var bottom10PercentileJobs = allJobs
    .OrderBy(j => j.Salary.SalaryAmount)
    .Take(tenthPercentileCount)
    .ToList();
4

2 回答 2

9

首先,您需要计算有多少条目构成 10%。您可以通过将列表的大小除以 10 来做到这一点(并舍入或截断以获得整数)。我们称这个号码为 X。

接下来,您需要salaray降序排列列表。您需要获取列表中的前 X 个元素。这些将是前10%的人。

要获得底部的 10%,您需要在从列表中获取X之前跳过前 90%(您可以使用 9X 或从完整尺寸中减去 X - 其中一个可能无法按预期工作) 。或者,您可以薪水排序列表并第一个 X。

使用System.Linq命名空间也会有所帮助。

于 2013-04-08T19:52:02.837 回答
1

我已经构建了一个扩展来删除列表的百分比。您需要做的就是在使用扩展程序之前订购列表。

   public static IEnumerable<T> RemoveBeforeAndAfter<T>(this IEnumerable<T> source, int percent, bool removeLast = false, bool removeFirst = false)
    {
        var enumerable = source as IList<T> ?? source.ToList();
        var sourceCount = enumerable.Count();
        var noRemove = Convert.ToInt32(Math.Ceiling((percent / 100D) * sourceCount));
        var remove = new List<T>();
        if (enumerable.Any())
        {
            if (removeLast)
                remove.AddRange(enumerable.Reverse().Take(noRemove));
            if (removeFirst)
                remove.AddRange(enumerable.Take(noRemove));
            return enumerable.Where(x => remove.Any(r => x.Equals(r))).ToList();

        }

        return default(IEnumerable<T>);
    }
于 2014-02-26T10:24:32.383 回答