2017-07-31 3 views
1

私はlinqステートメントでワイルドカードマッチングを実行しようとしていますが、疑わしいものとして動作しません。例についてはパターンマッチではなく、すべての単語に一致

_supplierItems.Where(w => 
w.description.ToLower().Contains(txtProductCode.Text)) 
         .Select(s=>s.code).FirstOrDefault(); 
cboSupplier.DataSource = _supplierItems; 
cboSupplier.DisplayMember = "description"; 
cboSupplier.ValueMember = "code"; 
cboSupplier.Enabled = true; 

名クリスチャンSeltmannと人型の下部ケースSまたは何でもそれはそれを見つけて、コンボの項目を埋める必要がある場合は、私の質問はあるこれを行うための正しい方法を含みます。

私はまた、次の

_supplierItems.Where(w => 
w.description.ToLower().Contains(txtProductCode.Text)).Select(s => 
s.code).ToList() 

を試してみました。しかし、誰かが何が起こっているかのように私を指摘することができ、それは、リストに文字列を変換することはできません。

答えて

0

使用

_supplierItems.Where(w => w.description.ToLower().Contains(txtProductCode.Text.ToLower())) 
    .Select(s => s.code) 
    .ToList() 

か、

public static bool ContainsIgnoreCase(this string source, string cont) 
{ 
    return source.IndexOf(cont, StringComparison.InvariantCultureIgnoreCase) >= 0; 
} 

のように独自の拡張メソッドを作成し、そのコードは、あなたがしているという事実を除いて、権利についての見えるそれ

_supplierItems.Where(w => w.description.ContainsIgnoreCase(txtProductCode.Text)) 
    .Select(s => s.code) 
    .ToList() 
+0

これは良い拡張メソッドですが、charの不完全さについての不満は、それが原因でTextがcharとして扱われないことです –

+0

@ david39niこんにちは、私の更新を見てください – Marusyk

0

使用することができますあなたのLinq呼び出しの戻り値で何もしないでください。お試しください

var result = _supplierItems.Where(w => w.description.ToLower().Contains(txtProductCode.Text)).Select(s=>s.code).FirstOrDefault(); 
cboSupplier.DataSource = result; 

このコードは、txtProductCodeコントロールの変更ハンドラで必要になります。

0

他の回答に記載されているように、最初の不具合は、LINQクエリの結果を無視していることです。 LINQはデータソースを変更しません。ToXxx()ToList()ToArray()ToDictionary()など)を使用するか、Select()またはWhere()の結果を反復処理すると、新しいデータストリームが生成されます。

第2の問題は、一致する最初のレコードのみをデータバインドすることです。

cboSupplier.DataSource = _supplierItems.Where(w => 
w.description.ToLower().Contains(txtProductCode.Text)) 
         .Select(s=>s.code); 

これは、一致するすべてのアイテムを検索します。

関連する問題