C# Linq在两个值之间选择一个id列表

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

我有一个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的示例—但是,它不允许范围—仅使用单个值。需要对其进行转换,以使每个术语介于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[]”数组作为初始参数,这样我就不会多次调用查询了

您可以使用
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));
    }