2012-01-13 10 views
2

これは問題の質問です。だから、私が質問を誤解した場合、何が起きているのか十分に理解していないからです。列挙型をリストにコピーしますか? "暗黙的にタイプ 'MyClass.Items'を 'System.Collections.Generic.List <MyClass.Items>'に変換できません"

問題

Compile error: Cannot implicitly convert type 'MyClass.Items' to 'System.Collections.Generic.List'

コンテキスト

私はIOrderedEnumerableを通じてListを反復していますが、それは(私の全体のため、型付きListであるので、私は目的のレコードを返すことができませんアプリはListオブジェクトを前後に渡しています)。

私のメソッドへの入力はListですが、OrderByオプションを使用すると、暗黙的にIEnumerableにキャストされているようです。

// ToList is not available! 
return SingleItemToCheck.ToList; 

または

// same type conversion error 
List<Items> ReturningList = SingleItemToCheck; 

問題コード

public static List<Items> FindCheapestItem(List<Items> source) 
{ 
    // Now we pop only the first one. 
    // ISSUE: Sometimes the top entry on the list is bad, 
    //  so we need to check it! 
    var BestItemCandidate = source.OrderBy(s => s.ItemDesirability); 
    bool ForgetThisOne = false; 

    foreach (var SingleItemToCheck in BestItemCandidate) 
    { 
     ForgetThisOne = false; 

     // ... test for ItemDesirability, truncated 
     if (Desirability < 0) 
     { 
      ForgetThisOne = true; 
     } 

     if (!ForgetThisOne) 
     { 
      // we are just returning the first desirable row 
      // because we are sorted on desirability 
      // and consuming code can only digest a single item. 
      return SingleItemToCheck; // !!! ARGH, compile error !!! 
     } 
    } 

    // means we looped through everything and found nothing of interest 
    return null; 
} 
+0

「アイテム」だけに興味がある場合、なぜあなたは 'リスト'を返しますか? – V4Vendetta

+0

私のアプリ全体がリストを渡すので。基本的には、すべてのコードが低レベルと高レベルで同じに見え、リスト上で動作するようにリストを使用しています。 – Jonesome

答えて

4

SingleItemToCheck:私は私が見つけたが、すべてに煮詰めるように見えるすべてのものを読んだことがある

単一の項目であり、リストではありません。利用可能な方法はToList()ではありません。その単一の項目でリストを作成するだけです。

return new List<Items> { SingleItemToCheck }; 

それとも、一つのアイテムでしか興味があるなら、単にItemsにメソッドの戻り値の型を変更し、完全リストを省略します。

それを書くための別の方法は、あなたが1つの項目で唯一興味場合は特に、単に関数に内部ループロジックをリファクタリングして、絶対にあなたの場合は、そうでない場合は、クエリ

return source 
     .OrderBy(s => s.ItemDesirability) 
     .Where(s => IsDesirable(s)) // refactored loop logic, returning boolean 
     .FirstOrDefault(); // first desirable item, or null 

を書くことですリストを必要としますが、それだけで一つの項目は、

var list = source 
     .OrderBy(s => s.ItemDesirability) 
     .Where(s => IsDesirable(s)) 
     .Take(1) 
     .ToList(); 

考える何の要素が通過しない場合、これは空のリストになります。現在のコードのようにnullを返すか、空のリストを返して、nullの結果ではなく呼び出し元に処理させることができます。

+0

アンソニー:ありがとう!私は最初の「新しいリストを返す」アプローチを使用しました。実際にはレコードのテストが増えているので、並べ替えに基づいて(1つだけ)取ることはできません。これは、あまりにも多くの時間を費やしたことを解決しました。私は早く投稿するべきだった! – Jonesome

関連する問題