2017-08-09 7 views
0

私はこれらのユニークなキーに基づいて別のリストをフィルタリングしようとしていますユニークなキーLINQフィルタエレメントは

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 

の文字列のリストを持っています。リスト内

データは次のように見ることができます。

To From  
01 05 
01 02 
09 04 
01 09 
01 45 
04 06 
27 12 

私はuniqueKeys

にある両方の「へ」とプロパティ値の「From」という方法で、このリストからデータを選択したいです望ましい結果は次のようになります。

To From 
09 04 
01 09 

私はインターネット上で多くの記事をしてきたAN私はSIMPLのロジックを記述することはできませんよe LINQフォーマット。

誰かがこの問題に直面した場合は、私を助けてください。

+0

グループ化してみてください? [This](https://stackoverflow.com/questions/5231845/c-sharp-linq-group-by-on-multiple-columns)は役に立ちます – user3185569

+1

あなたのリストはカスタムオブジェクトまたは辞書のリストにフィルタリングされますか? –

+0

List LINQで質問できないことは、List > –

答えて

6

あなたのクラス名のリストは "listToFrom"です。両方のプロパティで& &演算子を使用して、目的のリストを取得することができます。

var filteredList = listToFrom.Where(x=>uniqueKeys.Contains(x.To) && 
        uniqueKeys.Contains(x.From)).ToList(); 
+0

'.ToList()'の前に ')'がありません。 –

+0

ありがとう@JakubDąbek。修正済み:) – Harsh

2

.Containsを使用して、コレクションにアイテムが含まれているかどうかを確認できます。また、LINQ .Whereを使用して、指定した条件でコレクションをフィルタリングすることもできます。

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 
var result = data 
    .Where(x => uniqueKeys.Contains(x.From) && uniqueKeys.Contains(x.To)) 
    .ToArray(); 

心に留めておくべきであるもう一つのこと

- このアルゴリズムは線形であり、すなわちそれは uniqueKeys、それは価値が含まれているかどうかをチェックするたびに繰り返されます。 O(1) .Containsチェックを提供する HashSetを使用すると、パフォーマンスを向上させることができます。 uniqueKeys内の項目の数が少ない場合

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 
var uniqueKeysSet = new HashSet<string>(uniqueKeys); 
var result = data 
    .Where(x => uniqueKeysSet.Contains(x.From) && uniqueKeysSet.Contains(x.To)) 
    .ToArray(); 

ただし、このパフォーマンスの改善をスキップすることができます。それは必要性なしでコードを過度に複雑化するでしょう。

0

これは、次のように2つの.Contains() LINQの句を組み合わせることにより行うことができます。

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 

var data = new List<Tuple<string, string>> { 
new Tuple<string, string>("01", "05"), 
new Tuple<string, string>("01", "02"), 
new Tuple<string, string>("09", "04"), 
new Tuple<string, string>("01", "09"), 
new Tuple<string, string>("01", "45"), 
new Tuple<string, string>("04", "06"), 
new Tuple<string, string>("27", "12") 
}; 

var results = data.Where(d => uniqueKeys.Contains(d.Item1) && uniqueKeys.Contains(d.Item2)); 
3

あなたはとてもあなたが複数のフィールドでフィルタすることができ.Whereにいくつかの文を置くことができ、この場合、キーが.Containsです。

//Making test data 
List<Example> dataList = new List<Example>() 
{ 
    new Example() { From = "05", To = "01" }, 
    new Example() { From = "02", To = "01" }, 
    new Example() { From = "04", To = "09" }, 
    new Example() { From = "09", To = "01" }, 
    new Example() { From = "45", To = "01" }, 
    new Example() { From = "06", To = "04" }, 
    new Example() { From = "12", To = "27" } 
}; 
var uniqueKeys = new List<string> { "01", "04", "09", "26", "27" }; 

//Filter data 
var filteredList = dataList 
        .Where(row => uniqueKeys.Contains(row.To) && 
            uniqueKeys.Contains(row.From)) 
        .ToList(); 
0

2列

var uniqueKeys = new List<string> {"01", "04", "09", "26", "27"}; 


    List<Example> filtedvalues = Maindatas.FindAll(emp => uniqueKeys == emp.to && uniqueKeys == emp.from);