模式匹配所有单词不仅仅是整个

时间:2017-07-31 10:36:50

标签: c# linq

我正在尝试在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;

例如,如果名字为Christian Seltmann,并且该人员键入小写字母S或其应该找到的任何内容并填充组合项目,我的问题是包含正确的方法。

我也试过以下

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

但它不能将字符串转换为列表,有人可以指出我发生了什么。

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

该代码看起来是正确的,除了您没有对Linq调用的返回值做任何事情。尝试

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

您需要在txtProductCode控件的更改处理程序中使用此代码。

答案 2 :(得分:0)

正如其他答案中所提到的,第一个缺陷是你忽略了LINQ查询的结果。 LINQ不会改变数据源,如果您使用ToXxx()ToList()ToArray()ToDictionary()等内容,它会生成新的数据流,或者对结果进行迭代Select()Where()

第二个问题是你只是匹配第一个匹配的记录。

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

这将搜索所有匹配的项目。