2017-09-25 22 views
0

LINQ式を記述する際に問題が発生しています。 以下のリスト(パッケージとルール)からルールをフィルタリングしたいが、結果が正しくない。 下記の期待結果の式を書き直してください。LINQの式が正しくありません

public class Package 
{ 
    public int Id {get;set;} 
    public string PackageKey {get;set;} 
} 

public class Rule 
{ 
    public string Key1 {get;set;} 
    public string Key2 {get;set;} 
} 

public Class RuleEntity 
{ 
    public List<string> Keys {get;set;} 
} 

var rules = new List<Rule> 
{ 
    new Rule 
    { 
     Key1 = "001", 
     Key2 = "002", 
    }, 
    new Rule 
    { 
     Key1 = "001", 
     Key2 = "003", 
    }, 
    new Rule 
    { 
     Key1 = "004", 
     Key2 = "005", 
    }, 
    new Rule 
    { 
     Key1 = "006", 
     Key2 = "008", 
    } 
}; 

var packages = new List<Package> 
{ 
    new Package 
    { 
     Id = 1, 
     PackageKey = 001 
    }, 
    new Package 
    { 
     Id = 1, 
     PackageKey = 002 
    } 
}; 

var filteredRules = new List<RuleEntity>(); 

filteredRules.AddRange(packages.SelectMany(p => rules.Where(r => p.PackageKey.Equals(r.Key1) || p.PackageKey.Equals(r.Key2)) 
      .Select(r => new RuleEntity{ Keys = new List<string>{r.Key1, r.Key2}}) 
)); 


//Result from above expression is this. 
filteredRules 
{ 
    Keys{ "001", "002" }, 
    Keys{ "001", "003" } 
} 


//Result Expected is : 
filteredRules 
{ 
    Keys{ "001", "002" } 
} 

FilteredRulesには、キーがパッケージリストにあるルールのみが含まれている必要があります。パッケージリストにパッケージが1つしかない場合は、filteredRulesにルールは存在しません。

+0

に縮小されたルックアップ迅速に行うことが先行キーのHashSetのを持っている方が良いだろう両方のキーはパッケージリストにありますか? – LiverpoolOwen

+0

ルールがパッケージ権利と同じ 'Key1'と' Key2'を持っていれば、あなたはまだ1つのパッケージに対して結果を得るでしょうか?それが決して起こらない限り。 – juharr

答えて

4

私はこれがあなたの望むものだと信じています。

rules.Where(r => packages.Any(p => p.PackageKey == r.Key1) 
      && packages.Any(p => p.PackageKey == r.Key2)) 
    .Select(r => new RuleEntity 
     { 
      Keys = new List<string> 
      { 
       r.Key1, 
       r.Key2 
      } 
     }); 

しかし、

var keys = new HashSet<string>(packages.Select(p => p.PackageKey)); 

はその後Whereはあなたが唯一のルールはどこにしたいです

Where(r => keys.Contains(r.Key1) && keys.Contains(r.Key2)) 
+0

効率のためにハッシュセットを使用することをお勧めします。 – Chris

3

SelectManyは複雑すぎるようです。あなたはルールをフィルタリングするために欠けているようで始まり、そこから行く:

rules.Where(x=>packages.Any(y=>y.PackageKey==x.Key1) && packages.Any(y=>y.PackageKey==x.Key2)); 

これはKEY1は、あなたのパッケージリストとKEY2で試合はまた、あなたのパッケージのリストに一致するものを持っている任意のルールを返します。

関連する問題