0

我有一个清单:

List<Option> OptionList = getOptions();

选项具有各种属性,但重要的是

decimal Price 
string EqtCode

然后我有第二个列表:

List<string> EqtCodes

我要做的是从 OptionList 中获取选项,其中它们的 EqtCode 与EqtCodes 列表中的所有选项匹配。但是,为了使其更复杂,我实际上需要在 EqtCodes 中所有项目的“集合”中抓取它们列表,选择任何重复项的最低价格,但在 EqtCodes 列表中所有内容的集合中获取它们, 以便.. 尝试进一步解释

说eqtCodes中有以下内容

['A','B','C']

并且 optionList 有

{['A',99.99],['A',89.99],['B',20.00],['C',35.00'],['C',30.00]}

我需要的只是

['A',89.99],['B',20.00],['C',30.00'] 

我不希望它抓住所有的 A、B 和 C,除非它把它们分成 1 A、1 B 和 1 C

选择了目前我有

var whatIwant = OptionList.Where(o=>o.EqtCode.In(EqtCodes));

可悲的是,这会抓住一切,更不用说忽略价格了。同样,如果选项列表是

  {['A',99.99],['A',89.99],['B',20.00],['C',35.00'],['C',30.00],['B',22.00],['F',33.33], ['B',19.99]}

它需要抓住

{['A',99.99],['A',89.99],['B',20.00],['C',35.00'],['C',30.00],['B',19.99]}

所以它基本上每次都会抓取 EqtCodes 列表中所有项目的“全套”

我确信 LINQ 可以做到这一点,但我不能:)

一如既往地感谢任何帮助

谢谢

4

2 回答 2

1

你可以试试这个。

var query = from o in options
            where EqtCodes.Contains(o.EqtCode)
            group o by o.EqtCode into g;
            select g.OrderBy(x => x.Price).First();

此外,因为您谈到它必须是 EqtCodes 中的所有成员,所以如果没有足够的项目符合条件,以下代码将返回一个空集。

var query = from o in options
            where EqtCodes.Contains(o.EqtCode)
            group o by o.EqtCode into g;
            select g.OrderBy(x => x.Price).First();

 var options = query.ToArray();
 options = query.Length == EqtCodes.Length ? options : new options[0];

多组解决方案

var q = from o in options
   where EqtCodes.Contains(o.EqtCode)
   group o by o.EqtCode into g
   from i in Enumerable.Range(0, options.Count / EqtCodes.Count)
   let a = new {index = i, value = g.OrderBy(x => x.Price).Skip(i).Take(1)}
   where a.value.Any ()
   group a by a.index into b
   where b.Count() == EqtCodes.Count()
   select b.SelectMany(x => x.value).ToArray();

然后到单组

var singleSet = q.SelectMany(x => x); 

或者

var singleSet = q.SelectMany(x => x).ToArray();
于 2013-06-25T08:40:26.400 回答
0
var eqtCodes = new [] {'a', 'b', 'c'};
var optionList = new [] 
{
    new [] { 'a', '1' },
    new [] { 'a', '2' },
    new [] { 'b', '1' },
    new [] { 'c', '1' },
    new [] { 'd', '1' }
};

var lessOptionList = from o in optionList
                     group o by o[0] into p
                     select new { first = p.First() };

var result = lessOptionList.Where(a => eqtCodes.Contains(a.first[0]));
于 2013-06-25T08:42:29.093 回答