2017-06-14 3 views
1

を使用して、両方の属性に一致するすべてのIndividualRefを取得する必要があります。すべての属性をORではなくANDを使用して取得する必要があります。たとえば、以下のコードは、私が "ST"と "BJOG"に一致すると個別のref 22を取得する必要があります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).Where(G =>新しいHashSetの(g.Select(IND => ind.AttributeCode))。SetEquals(新しい[] { "BJOG" (g => g.Key) ' – spender

+0

GroupByを使用します。inds.GroupBy(x => new {attr = x.AttributeCode、ref = x.INdividual}) – jdweng

答えて

1

チェックする必要のあるすべての属性を保持するには、リストまたは配列を使用します。検索は、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); 
0

これを試してみてください。 Used 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();