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();