C# LINQ查询未返回预期结果
有人能帮我吗?我正在尝试使用LINQ执行一个简单的查询,但没有得到预期的结果C# LINQ查询未返回预期结果,c#,linq,C#,Linq,有人能帮我吗?我正在尝试使用LINQ执行一个简单的查询,但没有得到预期的结果 private void ButtonProductSearch_Click(object sender, EventArgs e) { string userSearch = textBoxSearchText.Text.ToLower(); var productSearch = from product in sales where product.ToStrin
private void ButtonProductSearch_Click(object sender, EventArgs e)
{
string userSearch = textBoxSearchText.Text.ToLower();
var productSearch =
from product in sales
where product.ToString().ToLower() == userSearch
select product;
MessageBox.Show(productSearch.Count().ToString()); //For Testing
sales.Clear();
sales.AddRange(productSearch);
DisplaySales(sales);
}
仅用于测试的消息返回0,我已确保输入了相关的搜索字符串
sales是一个Sale对象,由csv文件填充,还有一个dataGridView,由Sale对象填充,屏幕截图如下。当应用程序运行时,sales读取csv中的每一行,datagridview将填充该数据,屏幕截图如下
您需要了解,在来自销售中的产品的查询中,
产品是指销售中的行,而不是名为产品的列。因此,在product
上执行ToString()
将返回该行的字符串表示形式(通常是类本身的名称)。您应该这样编写查询:
var productSearch =
from s in sales
where s.Product.ToLower() == userSearch
select product;
这里再次说明,s
指的是销售的行,因此具有产品、价格和付款类型等所有属性。因此,您可以要求LINQ筛选其产品
属性等于用户搜索
的行。由于Product
是string类型,您甚至不需要对其执行ToString()
。您需要了解,在来自销售中的产品的查询中,Product
指的是sales
的行,而不是名为Product
的列。因此,在product
上执行ToString()
将返回该行的字符串表示形式(通常是类本身的名称)。您应该这样编写查询:
var productSearch =
from s in sales
where s.Product.ToLower() == userSearch
select product;
这里再次说明,s
指的是销售的行,因此具有产品、价格和付款类型等所有属性。因此,您可以要求LINQ筛选其产品
属性等于用户搜索
的行。由于Product
是string类型,您甚至不需要对其执行ToString()
。我认为@dotNET的答案似乎是正确的。为了完整起见,我建立了一个示例,并实现了不区分大小写的搜索:
using System;
using System.Linq;
using Bogus;
public class Program
{
public static void Main()
{
var productsFactory = new Faker<Product>()
.StrictMode(true)
.RuleFor(p => p.TransactionDate, f => f.Date.Between(DateTime.UtcNow.AddDays(-100), DateTime.UtcNow))
.RuleFor(p => p.Category, f => f.Commerce.ProductAdjective())
.RuleFor(p => p.Price, f => f.Random.Decimal(10, 100))
.RuleFor(p => p.PaymentType, f => f.PickRandomWithout(PaymentType.Unknown))
.RuleFor(p => p.Name, f => f.Commerce.ProductName())
.RuleFor(p => p.City, f => f.Address.City())
.RuleFor(p => p.State, f => f.Address.State())
.RuleFor(p => p.Country, f => f.Address.Country());
var products = productsFactory.Generate(50);
var userSearch = products.Skip(3).First().Name.Substring(2, 3);
var productSearch = products.Where(product => product.Name.IndexOf(userSearch, StringComparison.CurrentCultureIgnoreCase) >= 0);
foreach (var result in productSearch)
{
Console.WriteLine(String.Format("{0:G} {1} {2:N2}", result.TransactionDate, result.Name, result.Price));
}
Console.ReadKey();
}
}
public class Product
{
public DateTime TransactionDate { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
public PaymentType PaymentType { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
public enum PaymentType
{
Unknown,
Mastercard,
Visa,
Amex,
}
使用系统;
使用System.Linq;
使用伪造文件;
公共课程
{
公共静态void Main()
{
var productsFactory=新的伪造者()
.StrictMode(真)
.RuleFor(p=>p.TransactionDate,f=>f.Date.Between(DateTime.UtcNow.AddDays(-100),DateTime.UtcNow))
.RuleFor(p=>p.Category,f=>f.Commerce.product形容词())
.RuleFor(p=>p.Price,f=>f.Random.Decimal(10100))
.RuleFor(p=>p.PaymentType,f=>f.RuleFor(PaymentType.Unknown))
.RuleFor(p=>p.Name,f=>f.Commerce.ProductName())
.RuleFor(p=>p.City,f=>f.Address.City())
.RuleFor(p=>p.State,f=>f.Address.State())
.RuleFor(p=>p.Country,f=>f.Address.Country());
var products=productsFactory.Generate(50);
var userSearch=products.Skip(3.First().Name.Substring(2,3);
var productSearch=products.Where(product=>product.Name.IndexOf(userSearch,StringComparison.CurrentCultureIgnoreCase)>=0);
foreach(productSearch中的var结果)
{
WriteLine(String.Format(“{0:G}{1}{2:N2}”、result.TransactionDate、result.Name、result.Price));
}
Console.ReadKey();
}
}
公共类产品
{
公共日期时间事务日期{get;set;}
公共字符串类别{get;set;}
公共十进制价格{get;set;}
公共PaymentType PaymentType{get;set;}
公共字符串名称{get;set;}
公共字符串City{get;set;}
公共字符串状态{get;set;}
公共字符串国家{get;set;}
}
公共枚举付款类型
{
不详,
万事达卡,
签证
美国运股票交易所,
}
我认为@dotNET的答案在我看来是正确的。为了完整起见,我建立了一个示例,并实现了不区分大小写的搜索:
using System;
using System.Linq;
using Bogus;
public class Program
{
public static void Main()
{
var productsFactory = new Faker<Product>()
.StrictMode(true)
.RuleFor(p => p.TransactionDate, f => f.Date.Between(DateTime.UtcNow.AddDays(-100), DateTime.UtcNow))
.RuleFor(p => p.Category, f => f.Commerce.ProductAdjective())
.RuleFor(p => p.Price, f => f.Random.Decimal(10, 100))
.RuleFor(p => p.PaymentType, f => f.PickRandomWithout(PaymentType.Unknown))
.RuleFor(p => p.Name, f => f.Commerce.ProductName())
.RuleFor(p => p.City, f => f.Address.City())
.RuleFor(p => p.State, f => f.Address.State())
.RuleFor(p => p.Country, f => f.Address.Country());
var products = productsFactory.Generate(50);
var userSearch = products.Skip(3).First().Name.Substring(2, 3);
var productSearch = products.Where(product => product.Name.IndexOf(userSearch, StringComparison.CurrentCultureIgnoreCase) >= 0);
foreach (var result in productSearch)
{
Console.WriteLine(String.Format("{0:G} {1} {2:N2}", result.TransactionDate, result.Name, result.Price));
}
Console.ReadKey();
}
}
public class Product
{
public DateTime TransactionDate { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
public PaymentType PaymentType { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
public enum PaymentType
{
Unknown,
Mastercard,
Visa,
Amex,
}
使用系统;
使用System.Linq;
使用伪造文件;
公共课程
{
公共静态void Main()
{
var productsFactory=新的伪造者()
.StrictMode(真)
.RuleFor(p=>p.TransactionDate,f=>f.Date.Between(DateTime.UtcNow.AddDays(-100),DateTime.UtcNow))
.RuleFor(p=>p.Category,f=>f.Commerce.product形容词())
.RuleFor(p=>p.Price,f=>f.Random.Decimal(10100))
.RuleFor(p=>p.PaymentType,f=>f.RuleFor(PaymentType.Unknown))
.RuleFor(p=>p.Name,f=>f.Commerce.ProductName())
.RuleFor(p=>p.City,f=>f.Address.City())
.RuleFor(p=>p.State,f=>f.Address.State())
.RuleFor(p=>p.Country,f=>f.Address.Country());
var products=productsFactory.Generate(50);
var userSearch=products.Skip(3.First().Name.Substring(2,3);
var productSearch=products.Where(product=>product.Name.IndexOf(userSearch,StringComparison.CurrentCultureIgnoreCase)>=0);
foreach(productSearch中的var结果)
{
WriteLine(String.Format(“{0:G}{1}{2:N2}”、result.TransactionDate、result.Name、result.Price));
}
Console.ReadKey();
}
}
公共类产品
{
公共日期时间事务日期{get;set;}
公共字符串类别{get;set;}
公共十进制价格{get;set;}
公共PaymentType PaymentType{get;set;}
公共字符串名称{get;set;}
公共字符串City{get;set;}
公共字符串状态{get;set;}
公共字符串国家{get;set;}
}
公共枚举付款类型
{
不详,
万事达卡,
签证
美国运股票交易所,
}
什么是销售
?product.ToString()
返回什么?这里面有什么元素吗<