从列表中获得匹配两个属性的值使用c#LINQ

问题描述:

我有以下代码,我需要获得所有与两个属性匹配的IndividualRefs - 它需要使用AND而不是OR来获得所有。例如下面的代码应该只给我个人参考22,因为他匹配“ST”和“BJOG”从列表中获得匹配两个属性的值使用c#LINQ

你知道一个LINQ语句吗?

string AttributeList = "ST,BJOG,"; 
     List<StratogIndividuals> inds = new List<StratogIndividuals>(); 
     StratogIndividuals s = new StratogIndividuals(); 
     string[] attributes = AttributeList.Split(',').Where(x => x != "").ToArray(); 

     s.AttributeCode = "ST"; 
     s.IndividualRef = "22"; 
     inds.Add(s); 

     s = new StratogIndividuals(); 
     s.AttributeCode = "BJOG"; 
     s.IndividualRef = "22"; 
     inds.Add(s); 

     s = new StratogIndividuals(); 
     s.AttributeCode = "BJOG"; 
     s.IndividualRef = "20"; 
     inds.Add(s); 

     s = new StratogIndividuals(); 
     s.AttributeCode = "XXF"; 
     s.IndividualRef = "21"; 
     inds.Add(s); 

当然AttributeList的大小可以增加。 谢谢

+0

'inds.GroupBy(IND => ind.IndividualRef)。凡(G =>新的HashSet (g.Select(IND => ind.AttributeCode))。SetEquals(新[] { “BJOG” ,“ST”}))。Select(g => g.Key)' – spender

+0

使用GroupBy inds.GroupBy(x => new {attr = x.AttributeCode,ref = x.INdividual}) – jdweng

使用列表或数组来保存所有需要检查的属性。搜索可以使用LINQ来完成 - 创建个人查找其由参返回所有单个属性代码,然后检查组是否包含所有的属性:

var attributes = new []{ "ST", "BJOG" }; 

var refs = inds.ToLookup(i => i.Ref, i => i.AttributeCode) 
       .Where(g => !attributes.Except(g).Any()) 
       .Select(g => g.Key); 

请试试这个。使用GroupBy IndividualRef然后使用SetEqual以使其与属性匹配。

List<StratogIndividuals> inds = new List<StratogIndividuals>(){ 
      new StratogIndividuals(){ AttributeCode = "ST", IndividualRef = "22"}, 
      new StratogIndividuals(){ AttributeCode = "BJOG", IndividualRef = "22"}, 
      new StratogIndividuals(){ AttributeCode = "BJOG", IndividualRef = "20"}, 
      new StratogIndividuals(){ AttributeCode = "XXF", IndividualRef = "21"}, 
     }; 

     string AttributeList = "ST,BJOG,"; 
     string[] attributes = AttributeList.Split(',').Where(x => x != "").ToArray(); 

     var results = inds.GroupBy(ind => ind.IndividualRef) 
      .Where(g => new HashSet<string>(g.Select(i => i.AttributeCode)).SetEquals(attributes)) 
      .Select(x => x.Key).ToList();