我有一个以单数形式工作的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();
}
因此,简而言之,我希望实现以下目标:
答案 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 []'数组作为初始参数的变体,这样我就不会多次调用该查询了。
您可以使用int
到AmountRange
的字典。也就是说,每个不同的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();
}