如何在不直接访问其类型的情况下初始化空的临时变量

本文关键字:初始化 情况下 变量 类型 访问 | 更新日期: 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();

甚至不需要引用命名空间就可以获得结果。

一个选项是将tempResult声明为IList,并在联合IEnumerable上使用.ToList()。
        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));
相关文章: