2017-08-15 8 views
1

私のプログラムでは、私はExcelシートで読み込み中で、うまくいきました。if文の前にオブジェクトを初期化する

問題:If-ステートメントを適用して事前選択を試みました。変数はすべての場合に割り当てられます(if/else)が、コンパイラはそれを認識しません。コンパイラは、VaRのbeforehandsを初期化するために私に語ったが、私はことをしようとすると、私は、私は簡単にbeforehandsを割り当てることができ刺され、int型またはdoubleなどの変数を使用しておりますので、私は失敗:

//This function takes the downloaded xlsx and makes selection of applicable items 

var excel = new ExcelQueryFactory("list.xlsx"); 
//get all items with discount 
if (onlyAcceptDiscountedItems == true) 
{ 
    var discounts = from s in excel.Worksheet() 
        where s["Discount/Premium"].Cast<string>().StartsWith("-") 
        select s; 
} 
else 
{ 
    var discounts = excel.Worksheet(); 
} 
if (discounts.Count() != 0) 
{ 
    //some application logic comes here 
} 

を、私はそれをしようとするとそのように:

var excel = new ExcelQueryFactory("list.xlsx");ter code here 
var discounts = excel.Worksheet(); 
if (onlyAcceptDiscountedItems == true) 
{ 
    discounts = from s in excel.Worksheet() 
       where s["Discount/Premium"].Cast<string>().StartsWith("-") 
       select s; 
} 
if (discounts.Count() != 0) 
{ 
    //some application logic comes here 
} 

私は2番目のcodesnippetの5行で、次のエラーが表示されます。

エラーCS0266は、暗黙的ににタイプ 'System.Linq.IQueryable' を変換できません。'LinqToExcel.Query.ExcelQueryable'

あなたが明示的にしたい変数の型を宣言することができ、あなたが初期化することができ、その場合には明示的な 変換が他の人がありますが、私は、3つのオプションを参照してください(?あなたはキャストが欠落している)

+3

これは、型が暗示されているときにのみ 'var'を使うべきであるからです。あなたのLINQ文の結果は、 'excel.Worksheet() 'と同じではありません。 – maccettura

+0

@hnefatl私は同じことを信じています。 –

+1

最初の 'if .. else'ループでは、両方でローカル変数を作成しています。したがって、_変数はすべての場合に割り当てられます_は真ではありません - それぞれ異なるローカル変数**が割り当てられます。だから、コンパイラが不平を言うのです。 – stuartd

答えて

7

存在しますそれは別に、それぞれの場合に:

var discounts = onlyAcceptDiscountedItems 
    ? excel.Worksheet().Where(s => s["Discount/Premium"].Cast<string>().StartsWith("-")) 
    : excel.Worksheet(); 

IQueryable<LinqToExcel.Row> discounts; 
if (onlyAcceptDiscountedItems == true) 
{ 
    discounts = from s in excel.Worksheet() 
       where s["Discount/Premium"].Cast<string>().StartsWith("-") 
       select s; 
} 
else 
{ 
    discounts = excel.Worksheet(); 
} 

あなたは、変数を初期化する条件演算子を使用することができます次の2つの場所でexcel.Worksheetを呼び出すの冗長性を取り除くことができ

IQueryable<LinqToExcel.Row> discounts = excel.Worksheet(); 
if (onlyAcceptDiscountedItems) 
{ 
    discounts = discounts.Where(s => s["Discount/Premium"].Cast<string>().StartsWith("-")); 
} 

をさらに、あなたが本当に数を気にしないことを考えると、discounts.Any()代わりのdiscounts.Count() > 0を使用することをお勧めします。

+0

ありがとうございます。エクセルシートに数百のエントリが含まれていて、後の2つのオプションが多くのシステムリソースを無駄にするかもしれないと私はソリューション1を選択しました。 –

+1

@JulianBechtold:あなたはそれらのどれがもっと高価だと思いますか?彼らは本当に、本当にありません。 –

+0

あなたは私がまだ仕事をしなかった2番目の問題の解決法を私に与えているかもしれません。 'discounts.Count()> 0'は、項目がないときにnull例外を返します。私は 'discounts.Any()'と違うと思う? –

関連する問題