从列表中获得匹配两个属性的值使用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的大小可以增加。 谢谢
答
使用列表或数组来保存所有需要检查的属性。搜索可以使用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();
'inds.GroupBy(IND => ind.IndividualRef)。凡(G =>新的HashSet(g.Select(IND => ind.AttributeCode))。SetEquals(新[] { “BJOG” ,“ST”}))。Select(g => g.Key)' –
spender
使用GroupBy inds.GroupBy(x => new {attr = x.AttributeCode,ref = x.INdividual}) – jdweng