使用linq按子集合的属性进行筛选


class Store
{
    public int ID { get; set; }
    public List<AnnualData> annualData { get; set; }
}
class AnnualData
{
    public int Year { get; set; }
    public Dictionary<string, double> Data { get; set; }
}

我需要得到请求的商店和请求的年份的数据。我可以很容易地过滤商店:

List<int> storeIDs = new List<int> {12, 13, 14};
List<Store> stores = allData.Stores.Where(s => storeIDs.Contains(s.ID)).ToList();

但是我不知道如何通过年份列表进一步过滤。

List<int> years = new List<int> {2012, 2013, 2014};
stores = allData.Stores.Where(s => storeIDs.Contains(s.ID)).?????

尝试任何/所有/包含,但我显然不理解Linq足够好。提前谢谢。

Selmann &盖使用您的示例,我仍然在输出中看到存储1的所有3年-在本例中我只想看到2007年:

   static void Main(string[] args)
    {
        List<Store> allData = new List<Store> {                 
            new Store { ID = 1,
                        annualData = new List<AnnualData> {
                            new AnnualData {
                                Year = 2006,
                                Data = new Dictionary<string, double>{{"Value2006", 1.0}}
                            },
                            new AnnualData {
                                Year = 2007,
                                Data = new Dictionary<string, double>{{"Value2007", 1.1}}
                            },
                            new AnnualData {
                                Year = 2008,
                                Data = new Dictionary<string, double>{{"Value2008", 1.2}}
                            }
                        }
            }
        };
        List<int> storeIDs = new List<int> { 1 };
        List<int> years = new List<int> { 2007 };
        var stores = allData.Where(s => storeIDs.Contains(s.ID) &&
                                     s.annualData.Any(x => years.Contains(x.Year)));
        foreach (Store s in stores)
            foreach (AnnualData a in s.annualData)
                Console.WriteLine(a.Year);
    }

您可以使用Any方法:

stores = allData.Stores.Where(s => storeIDs.Contains(s.ID) && 
                                 s.annualData.Any(x => years.Contains(x.Year)));
stores = allData.Stores
    .Where(s => storeIDs.Contains(s.ID))
    .Select(s => new Store
    {
        ID = s.ID,
        annualData = s.annualData
            .Where(x => years.Contains(x.Year))
            .ToList()
    });

如果AnnualData对象列表中只包含年份为2007的对象,则不能选择Store对象,因为不存在这样的对象。您获得所有年份的原因是因为您选择了一个Store对象,其中列表中的任何AnnualData对象都具有2007年-但它仍然返回整个列表。

要获得一个Store,其中只包含您想要的AnnualData项列表,您需要创建它…

var stores = allData.Where(s => storeIDs.Contains(s.ID))
                    .Select(s =>
                        new Store { ID = s.ID, annualData = s.annualData.Where(x => years.Any(y => y == x.Year)).ToList() } )
                    .ToList();

相关内容

  • 没有找到相关文章

最新更新