2017-10-21 30 views
-1

的名单我有一个LINQ查询,在奇异的作品2个值之间进行选择 - 那就是:的LINQ的ID

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 []'作为初始参数的数组,以便我不会多次调用该查询。

如果这是一个单值的数组,我会简单地使用.Contains功能,但它不。

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

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数组[](术语)作为参数。
  • 选择所有的行,其中每个术语值落在表值 MinAmount和Max Amount之间。
+0

我觉得你倒退了。更改函数返回列表。然后将.First()更改为.List()。 – jdweng

+0

@jdweng - bove的例子就是一个参数的存在 - 它不是新版本正在进行的工作。 –

+0

你为什么要返回'First'而不是'ToList'?如果这是算法,你100%确定它的工作正确,那么我没有任何争论。我只是问,所以我可以提供正确的答案。 –

回答

-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(); 
} 
+0

这应该返回'列表'不'AmountRange' –

+0

@ M.kazemAkhgary - 我认为你有错误的想法,第一个例子只是它作为一个单行完成的例子。 –

+0

如果您为单一输入返回单个项目,那么我假设您应该为多个输入返回多个项目。如果这不是这种情况,那么你的问题并不清楚。请进一步解释。在你的第二个例子中,你也要返回多个项目。 @JohnOhara –

0

我想要做的是使接受的“INT []”作为初始PARAM让我没有打电话查询几次数组另一种变体。

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

感谢您的努力 - 现在就来测试答案,并尽快给予奖励。 –