Linq为id列表选择2个值

时间:2017-10-21 08:43:30

标签: c# linq

我有一个以单数形式工作的linq查询 - 这里是:

public static AmountRange GetAmountRange(int term)
{
     return amountTable
        .Where(x => term.IsBetween(x.MinTerm, x.MaxTerm))
        .Select(x => new AmountRange(term, x.MinAmount, x.MaxAmount))
        .First();
}

IsBetween函数是一个简单的'int'扩展方法,完全按照它的说法进行。

我想做的是创建另一个接受'int []'数组作为初始参数的变体,这样我就不会多次调用该查询了。

如果这是一个单值数组,我只会使用.Contains功能,但它没有。

这是一个使用.Contains的示例 - 但是,它不允许范围 - 只有一个值。它需要转换为使用术语IsBet之间的MinAmount和MaxAmount。

public static IEnumerable<AmountRange> SelectAmountRange(int[] terms)
{
    var termList = terms.ToList();

    return amountTable.Where(t => termList.Contains(t.MinAmount))
        .Select(x => new AmountRange(term would go here, x.MinAmount, x.MaxAmount))
        .ToList();
}

因此,简而言之,我希望实现以下目标:

  • 传递一个int [](terms)数组作为参数。
  • 选择每个术语值落在表值之间的所有行 MinAmount和Max Amount。

3 个答案:

答案 0 :(得分:1)

鉴于对象:

public class AmountRange
{
    public AmountRange(int term, int minAmount, int maxAmount)
    {
        Term = term;
        MinTerm = minAmount;
        MaxTerm = maxAmount;
    }

    public int Term { get; }
    public int MinTerm { get; }
    public int MaxTerm { get; }
}

我认为您正在寻找的是对已通过的条款和对象中的条款的加入,然后相应地应用过滤器:

    public static IEnumerable<AmountRange> GetAmountRange(int[] terms)
    {
        return amountTable
            .Join(terms, 
                range => range.Term, 
                term => term, 
                (range, term) => new { range, term })
           .Where(x => x.term.IsBetween(x.range.MinTerm, x.range.MaxTerm))
           .Select(x => new AmountRange(x.term, x.range.MinTerm, x.range.MaxTerm));
    }

答案 1 :(得分:0)

  

我想做的是创建另一个接受'int []'数组作为初始参数的变体,这样我就不会多次调用该查询了。

您可以使用intAmountRange的字典。也就是说,每个不同的int都映射到单个AmountRange

public static Dictionary<int, AmountRange> GetAmountRanges(int[] terms)
{
     return terms.Distinct().ToDictionary(
                 key => key,  
                 term => amountTable
                 .Where(x => term.IsBetween(x.MinTerm, x.MaxTerm))
                 .Select(x => new AmountRange(term, x.MinAmount, x.MaxAmount))
                 .First());
}

以便访问字典项。

var ranges = GetAmountRanges(terms);

foreach(var kvp in ranges)
{
    var index = kvp.Key;
    var range = kvp.Value;

    // do stuff
}

如果terms可以包含重复项,那么您应该以这种方式访问​​项目。

var ranges = GetAmountRanges(terms);

foreach(var i in terms)
{
    var kvp = ranges[i];
    var index = kvp.Key;
    var range = kvp.Value;

    // do stuff
}

答案 2 :(得分:-1)

public static AmountRange GetAmountRange(int[] terms)
{
     return amountTable
        .Where(x => terms.All(y => y.IsBetween(x.MinTerm, x.MaxTerm)))
        .Select(x => new AmountRange(terms, x.MinAmount, x.MaxAmount))
        .ToList();
}

另一种方法

public static List<AmountRange> GetAmountRange(int[] terms)
{
     return amountTable
        .Select(x => new {Item=x, Terms=terms.Where(z => z.IsBetween(x.MinTerm, x.MaxTerm))})
        .SelectMany(x => x.Terms.Select(term => new AmountRange(term, x.Item.MinAmount, x.Item.MaxAmount)))
        .ToList();
}