2011-06-30 11 views
2

私はリストを検索する方法を探しています。私は私の基準リストで見つかったテキストが含まれている任意の以外のすべての要素のインデックスを返す検索を作りたいC#:リストから特定のインデックス値を選択する

Blue, 3 
Red, 3 
Blue, 1 
Blue, 9 
Red, 5 

次のように元のために私は、カンマで区切られた文字列のリストを持っています。基準リストが含まれている可能性があり:

Blue, 3 
Red, 5 

をので、擬似コードでは、それは、(criteriaListのすべての要素で見つかった単語)

上記のインデックスを返す必要があります含む

ColorList.SelectIndex(だろう! 1,2,3

おかげ

答えて

2
var indexes = ColorList.Select((x, i) => new { Value = x, Index = i }) 
         .Where(x => !criteriaList.Contains(x.Value)) 
         .Select(x => x.Index); 

あなたのリストCの場合多くのアイテムがある場合はcriteriaListを最初にHashSet<T>に変換してください。 (あなたは、これはあなたのケースでは、より良い選択肢であるかどうかを判断するためにベンチマークする必要があります。)

var criteriaSet = new HashSet<string>(criteriaList); 
var indexes = ColorList.Select((x, i) => new { Value = x, Index = i }) 
         .Where(x => !criteriaSet.Contains(x.Value)) 
         .Select(x => x.Index); 
+0

oops:フィルタリングされたリストのインデックスを使用していますか? 0,1,2(テストします) – sehe

+0

これはcriteriaList.Contains(x)文を使ってcriteriaList全体を一度に検索しますか?そして、それはcolorListのインデックス整数値を返しますか? – KerryL

+0

@sehe、@KerryL:おっと!今すぐ修正しました。 – LukeH

2
var list = new []{"Blue, 3", "Red, 3", "Blue, 1", "Blue, 9", "Red, 5"}; 
var criteria = new []{"Blue, 3", "Red, 5"}; 

var filtered = list 
     .Select((s,i)=>new {s,i}) 
     .Where(e => !criteria.Contains(e.s)) 
     .Select(e => e.i); 

結果:{ 1, 2, 3 }

+0

電子は何ですか?それは正確に何ですか? – KerryL

+0

Select拡張メソッドの既知のオーバーロード(バージョン)を使用しています(http://msdn.microsoft.com/en-us/library/bb534869.aspx)。これは「計数」列挙子であり、2つの値(s、i)を取得します。文字列** _および_ **インデックス – sehe

0

あなたは

List<KeyValuePair<string, int>> pair = new KeyValuePair<string, int> 
を使用する場合がありますように聞こえます

次にできること

foreach (KeyValuePair<string, int> p in pair){ 
    s = p.Key; 
    i = p.Value; 
} 

を取得して値を取得する

+1

この解決策は何ですか?必要ならば、単に 'list.Select((s、i)=> new {s、i})を実行してください。ToDictionary(e => e.i、e => e.s) ';しかし、 'list [n]'を直接使って_little_を追加します。 – sehe

+0

私の主なポイントは、文字列のリストに値を格納するのではなく、KeyValuePairsのリストを使用する方が簡単で紛らわしいと思います。特に、このリストをこの検索以上に使用する予定がある場合は特にそうです。しかし、それぞれ自分自身に。 – Reed

0

私はあなたがここで達成したいとは思っていないので、おそらく私の答えはあなたが探しているものではありません。

とにかく、一般的なリストでは、あなたのコレクションでラムダ式/ linqステートメントを使うことができます。

internal class ListLambdaLINQSample 
{ 

    List<KeyValuePair<Colors, int>> listSource; 
    List<KeyValuePair<Colors, int>> listCriteria; 
    List<KeyValuePair<Colors, int>> listMatches; 

    private const int COLORCODE1 = 1; 
    private const int COLORCODE2 = 2; 
    private const int COLORCODE3 = 3; 
    private const int COLORCODE4 = 4; 
    private const int COLORCODE5 = 5; 

    internal enum Colors 
    { 
     Red, Blue, Green, Yellow 
    } 


    public ListLambdaLINQSample() 
    { // populate the list 
     listSource = new List<KeyValuePair<Colors, int>>(); 
     listCriteria = new List<KeyValuePair<Colors, int>>(); 

     _populateListCriteria(); 
     _populateListSource(); 

     ... 
    } 

    private void _getMatchesWithLINQ() 
    { 
     listMatches = 
         (from kvpInList 
          in listSource 
         where !listCriteria.Contains(kvpInList) 
         select kvpInList).ToList(); 
    } 

    private void _getMatchesWithLambda() 
    { 
     listMatches = 
      listSource.Where(kvpInList => !listCriteria.Contains(kvpInList)).ToList(); 
    } 


    private void _populateListSource() 
    { 
     listSource.Add(new KeyValuePair<Colors, int>(Colors.Blue, COLORCODE1)); 
     listSource.Add(new KeyValuePair<Colors, int>(Colors.Green, COLORCODE2)); 
     listSource.Add(new KeyValuePair<Colors, int>(Colors.Red, COLORCODE3)); 
     listSource.Add(new KeyValuePair<Colors, int>(Colors.Yellow, COLORCODE4)); 
    } 

    private void _populateListCriteria() 
    { 
     listCriteria.Add(new KeyValuePair<Colors, int>(Colors.Blue, COLORCODE1)); 
     listCriteria.Add(new KeyValuePair<Colors, int>(Colors.Green, COLORCODE2)); 
    } 
} 

希望があれば、次の例を考えてみましょう。

よろしく、 ニコ

PS:私はこのコードをコンパイルしたりテストしていません。

2
void Main() 
{ 
    var data = new List<string> {"Blue, 3", "Red, 3", "Blue, 1", "Blue, 9", "Red, 5"}; 

    var colorList = new List<string> {"Blue, 3", "Red, 5"}; 

    var indexes = data.Except(colorList).Select (x => data.IndexOf(x)); 

    indexes.Dump(); 
} 
関連する問題