如何在不直接访问其类型的情况下初始化空的临时变量
本文关键字:初始化 情况下 变量 类型 访问 | 更新日期: 2023-09-27 18:29:18
假设我有以下类和对象:
class Product
{
public int ProductId { get; set; }
public string ProductDesc { get; set; }
}
string[] keywordArray = new string []{"A", "B", "C", "D"};
var products = repository.GetAllProducts();
我使用var
是因为GetallProducts()
返回IQueryable<Product>
,但我无法"看到"Product
类型,因为它是在我的DAL中定义的。
现在我需要一个临时变量tempResult
来将临时结果存储在foreach
中。例如:
foreach(var keyword in keywordArray)
{
tempResult = tempresult.Union(products.Where(p => p.ProductDesc.Contains(keyword)));
}
如果我在foreach
中声明var tempResult
,它在每次迭代时都会被覆盖(并且它会给出编译时错误,因为它在初始化之前无法使用)。
因此,我需要在前臂外侧将其内化。如果我使用:
var tempResult = products;
在我的foreach
中,我只是对整个集合进行了总结——我的无序结果集。
因此,只有两种可能的解决方案:
1) 在存储库中创建一个返回空IQueryable<Product>
(工厂模式)的方法
2) 使用反射(如果可行,还不确定)
我发现这两种解决方案都有点"肮脏"。是否有其他方法/模式来实现这一点?感谢
您的代码必须能够"看到"Product
类型,因为您正在访问ProductDesc
等等
您只需要为DAL的命名空间添加一个using语句,或者在最坏的情况下将tempResult
设置为Enumerable.Empty<My.DAL.Namespace.Product>();
仅仅为了避免引用命名空间而创建一个完整的方法是不必要的;使用反射更糟糕。
转念一想,打电话给
var notTempResult = keywordArray.SelectMany(
kw => products.Where(p => p.ProductDesc.Contains(kw)).Distinct();
甚至不需要引用命名空间就可以获得结果。
string[] keywordArray = new string[] {"A", "B", "C", "D"};
var products = repository.GetAllProducts();
IList<Product> tempResult = new List<Product>();
foreach (var keyword in keywordArray)
{
//declared because of access to modified closure issue.
string keyword1 = keyword;
tempResult = tempResult.Union(products.Where(p =>
p.ProductDesc.Contains(keyword1))).ToList();
}
Dynamic tempResult = null;
foreach(var keyword in keywordArray)
{
if (tempResult == null) {
tempResult = products.Where(p => p.ProductDesc.Contains(keyword));
}
else {
tempResult = tempresult.Union(products.Where(p => p.ProductDesc.Contains(keyword)));
}
}
您可以使用linq表达式,而不需要使用任何临时变量。
var result = products.Where(p => keywordArray.Contains(p.ProductDesc));