LINQ:根据另一个列表中元素上方的数学条件过滤列表

时间:2019-06-11 08:33:44

标签: c# linq

我有一个实体列表,其中一个字段(UtcOffset)是一个数字。

我有一个过滤器列表offsets,它是数字列表。

我想用LINQ从第一个列表中选择UtcOffset字段等于或小于添加了固定delta(3600)的筛选器列表中值的所有实体。

我有一个仅适用于“相等大小写”的代码

public class TimeZone
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int UtcOffset { get; set; }
}


var delta = 3600;

List<TimeZone> TimeZones = new List<TimeZone>()
{
    new TimeZone() {Id = 1, Name = "America/Tortola", UtcOffset = -14400},
    new TimeZone() {Id = 2, Name = "Asia/Kathmandu", UtcOffset = 20700},
    new TimeZone() {Id = 3, Name = "Asia/Kolkata", UtcOffset = 19800},
    new TimeZone() {Id = 4, Name = "Africa/Tunis", UtcOffset = 3600},
    new TimeZone() {Id = 5, Name = "Africa/Windhoek", UtcOffset = 7200},
    new TimeZone() {Id = 6, Name = "Europe/Simferopol", UtcOffset = 10800},
}

List<Int32> offsets = new List<Int32>()
{
    3600, -10800, -14400
};

var matchedList = TimeZones.Where(t => offsets.Contains(t.UtcOffset)).ToList();

它返回ID为1和4的实体。

我要选择ID为1、4、5(UtcOffset小于或等于3600 + delta,-10800 + delta,-14400 + {{1 }}。

如何修改LINQ表达式以匹配这种情况?

2 个答案:

答案 0 :(得分:3)

如果您希望它更有效地工作,只需使用它(@yawnobleix的信用点就可以发现它,尽管确实需要Max()而不是Min()

var matchedList = TimeZones.Where(t => t.UtcOffset <= (offsets.Max() + delta)).ToList();

答案 1 :(得分:2)

这种方式:

class Program
{
    static void Main(string[] args)
    {
        var delta = 3600;

        List<TimeZone> TimeZones = new List<TimeZone>()
        {
            new TimeZone() {Id = 1, Name = "America/Tortola", UtcOffset = -14400},
            new TimeZone() {Id = 2, Name = "Asia/Kathmandu", UtcOffset = 20700},
            new TimeZone() {Id = 3, Name = "Asia/Kolkata", UtcOffset = 19800},
            new TimeZone() {Id = 4, Name = "Africa/Tunis", UtcOffset = 3600},
            new TimeZone() {Id = 5, Name = "Africa/Windhoek", UtcOffset = 7200},
            new TimeZone() {Id = 6, Name = "Europe/Simferopol", UtcOffset = 10800},
        };

        List<Int32> offsets = new List<Int32>()
        {
            3600, -10800, -14400
        };

        var matchedList = TimeZones.Where(x => offsets.Any(y => x.UtcOffset <= (y + delta))).ToList();
    }
}

public class TimeZone
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int UtcOffset { get; set; }
}