如何组合两个不同 类 中的信息以在列表框中显示结果?
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 来做任何其他事情),我不确定是否有更好的方法来达到目标。我听说过 CompositeCollection
和 CollectionView
,但我不确定这对我是否有帮助。
那么,除了单独的 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);
}
}
我的程序包含两个不同的 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 来做任何其他事情),我不确定是否有更好的方法来达到目标。我听说过 CompositeCollection
和 CollectionView
,但我不确定这对我是否有帮助。
那么,除了单独的 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);
}
}