如何组合两个不同 类 中的信息以在列表框中显示结果?

How can I combine information in two different classes to show the result in a ListBox?

我的程序包含两个不同的 classes。我想结合两者的值,只是为了在 ListBox 中显示结果信息。信息存储在数据库中,我代码中的 classes 是由 LINQ to SQL DataClass.

创建的

第一个 class(反应器参数)

这个class包含特定时间反应器的信息,如火焰温度、油量、空气量...

Class定义:

public class ReactorParameters
{
    public TimeSpan Time
    { get; set; }

    public double Temperature
    { get; set; }

    public double Oil
    { get; set; }

    public double Air
    { get; set; }
}

示例数据:

第二个class(产品信息)

ProductInformation class 存储有关反应器在什么时间段生产了哪种产品的信息。

Class定义:

public class ProductInformation
{
    public TimeSpan Time_From
    { get; set; }

    public TimeSpan Time_To
    { get; set; }

    public Product Product
    { get; set; }
}

示例数据:

我想要什么样的结果?

我想要实现的是将反应器参数与在给定时间生产的产品相结合。

这是一个简单的任务。你为什么要问?

当然,我可以新建一个class,为每个ReactorParameters创建一个实例,并将相关的Product存储在其中。但是由于这只是为了 UI 目的(我不需要额外的 class 来做任何其他事情),我不确定是否有更好的方法来达到目标​​。我听说过 CompositeCollectionCollectionView,但我不确定这对我是否有帮助。

那么,除了单独的 class 来填充我的 ListBox 之外,还有其他方法吗?

在我看来,我应该选择一个包含 class 的新 class 作为 属性。这种方式允许您在未来扩展,以防您需要更多属性。

public class ProductReactorModel
{
    public ReactorParameters ReactorParameters {get;set;}
    public ProductInformation ProductInformation {get;set;}
}

然后创建新创建的列表classList<ProductReactorModel>。将此列表绑定到 ListBox。使用此 class,您可以访问 classes 和属性以显示在您的 ListBox 中。在ListBox内部按以下方式绑定。

{Binding ReactorParameters.Time}

您必须创建视图 class 才能绑定它。

试试下面的代码(我用 string 替换了 Product 进行测试):

public class ReactorParameters
{
    public TimeSpan Time { get; set; }

    public double Temperature { get; set; }

    public double Oil { get; set; }

    public double Air { get; set; }
}

public class ProductInformation
{
    public TimeSpan Time_From { get; set; }

    public TimeSpan Time_To { get; set; }

    public string Product { get; set; }
}

public class ReactorView
{
    public ReactorParameters Parameters { get; set; }
    public ProductInformation Product { get; set; }
}

/// <summary>
/// entry point
/// </summary>
public void Test()
{
    Random rnd = new Random(1000);

    // random parameters
    List<ReactorParameters> parameters = (from i in Enumerable.Range(0, 24)
                                          select new ReactorParameters
                                          {
                                              Time = TimeSpan.FromHours(i),
                                              Temperature = rnd.NextDouble() * 50.0,
                                              Oil = rnd.NextDouble() * 20.0,
                                              Air = rnd.NextDouble() * 30.0,
                                          }).ToList();

    // product information
    List<ProductInformation> products = (from i in Enumerable.Range(0, 4)
                                         select new ProductInformation
                                         {
                                             Time_From = TimeSpan.FromHours(i * 6),
                                             Time_To = TimeSpan.FromHours(i * 6 + 6),
                                             Product = "Product " + (char)('A' + i),
                                         }).ToList();


    // combine
    var result = parameters.SelectMany(param => from product in products
                                                where param.Time >= product.Time_From && param.Time <= product.Time_To
                                                select new ReactorView
                                                {
                                                    Parameters = param,
                                                    Product = product
                                                });

    // alternative query
    var resultAlt = from param in parameters
                 from product in products
                 where param.Time >= product.Time_From && param.Time <= product.Time_To
                 select new ReactorView
                 {
                     Parameters = param,
                     Product = product
                 };

    // print result
    foreach (var item in result)
    {
        Console.WriteLine("{0,-5} {1,-8:0.00} {2,-8:0.00} {3,-8:0.00} {4,-10}",
            item.Parameters.Time, item.Parameters.Temperature, item.Parameters.Air, item.Parameters.Oil, item.Product.Product);
    }
}