C# Linq在两个值之间选择一个id列表
我有一个linq查询,它是单数形式的,如下所示:C# Linq在两个值之间选择一个id列表,c#,linq,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
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的示例—但是,它不允许范围—仅使用单个值。需要对其进行转换,以使每个术语介于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();
}
public静态IEnumerable SelectAmountRange(int[]术语)
{
var termList=terms.ToList();
返回amountTable.Where(t=>termList.Contains(t.MinAmount))
.Select(x=>newamountrange(术语将放在这里,x.MinAmount,x.MaxAmount))
.ToList();
}
因此,简而言之,我想实现以下目标:
- 传递int[](术语)数组作为参数
- 选择每个术语值位于表值之间的所有行 MinAmount和Max Amount
int
字典来amounterange
。也就是说,每个不同的int
映射到一个amuntrage
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 i in terms)
{
var kvp = ranges[i];
var index = kvp.Key;
var range = kvp.Value;
// do stuff
}
另一种方法
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();
}
publicstaticlist GetAmountRange(int[]术语)
{
返回数量表
.Select(x=>new{Item=x,Terms=Terms.Where(z=>z.IsBetween(x.MinTerm,x.MaxTerm))})
.SelectMany(x=>x.Terms.Select(term=>newamountrange(term,x.Item.MinAmount,x.Item.MaxAmount)))
.ToList();
}
给定对象:
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));
}
public静态IEnumerable GetAmountRange(int[]术语)
{
返回数量表
.加入(条款),
range=>range.Term,
术语=>术语,
(范围,术语)=>新的{范围,术语})
.其中(x=>x.term.IsBetween(x.range.MinTerm,x.range.MaxTerm))
.Select(x=>newamountrange(x.term,x.range.MinTerm,x.range.MaxTerm));
}
我认为你是在倒退。将函数更改为返回列表。然后将.First()更改为.List()。@jdweng-上面的示例是当前存在的单个参数-它不是新版本的正在进行的工作。为什么返回First
而不是ToList
?如果这是一个算法,你100%确信它是正确的,那么我没有任何理由。我只是想问一下,以便我能提供正确的答案。请提供,您要求将int[]
的单个amuntrage
作为输入返回。但在第二个示例中,您返回了多个项目。这里的逻辑是什么?这应该返回List
而不是AmountRange
@M.kazemAkhgary-我认为您的想法是错误的,第一个示例只是一个如何将其作为一行执行的示例。如果您为单个输入返回单个项,那么我假设您应该为多个输入返回多个项。如果这里不是这样,那么你的问题就不清楚了。请进一步解释。在第二个示例中,您也返回了多个项目@JohnOhara@detoix-这看起来不错,但我也需要返回术语-请参见AMONTRANGE类-变量术语需要是单个术语,而不是列表。@ODawgG-刚刚突出显示了此细节-您是对的,它应该是被查询的单个术语。感谢您的努力-现在就开始测试答案,并将尽快授予奖励。
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));
}