C# 如何将两个不同类中的信息组合在一起,以便在列表框中显示结果?
我的程序包含两个不同的类。我想将两者的值组合起来,只在C# 如何将两个不同类中的信息组合在一起,以便在列表框中显示结果?,c#,wpf,listbox,C#,Wpf,Listbox,我的程序包含两个不同的类。我想将两者的值组合起来,只在列表框中显示结果信息。信息存储在数据库中,我的代码中的类是由LINQ to SQLDataClass创建的 一级(反应器参数) 本课程包含特定时间内反应器的相关信息,如火焰温度、油量、空气量 类别定义: 示例数据: 二等(产品信息) ProductInformation类存储关于反应器在什么时间段生产的产品的信息 类别定义: 示例数据: 我希望结果是什么样的? 我想要实现的是将反应器参数与给定时间生产的产品相结合 这是一项简单的任务。你
列表框中显示结果信息。信息存储在数据库中,我的代码中的类是由LINQ to SQLDataClass
创建的
一级(反应器参数)
本课程包含特定时间内反应器的相关信息,如火焰温度、油量、空气量
类别定义:
示例数据:
二等(产品信息)
ProductInformation
类存储关于反应器在什么时间段生产的产品的信息
类别定义:
示例数据:
我希望结果是什么样的?
我想要实现的是将反应器参数与给定时间生产的产品相结合
这是一项简单的任务。你为什么这么问?
当然,我可以创建一个新类,为每个反应器参数
创建一个实例,并在其中存储相关的产品
。但是,由于这只是出于UI目的(我不需要额外的类来完成任何事情),我不确定是否有更好的方法来实现这一目标。我听说过CompositeCollection
和CollectionView
,但我不确定这是否对我有帮助
那么,除了使用单独的类来填充我的列表框
,还有其他方法吗?在我看来,我应该选择一个包含这些类作为属性的新类。这种方式允许您在将来扩展,以防您需要更多的属性
public class ProductReactorModel
{
public ReactorParameters ReactorParameters {get;set;}
public ProductInformation ProductInformation {get;set;}
}
然后创建新创建的类的列表list
。将此列表绑定到列表框。使用该类,您可以访问要显示在您的列表框中的类和属性。在列表框内按以下方式绑定
{Binding ReactorParameters.Time}
您必须创建视图类来绑定它
尝试以下代码(我将产品
替换为字符串
进行测试):
公共类反应器参数
{
公共时间跨度时间{get;set;}
公共双温{get;set;}
公共双油{get;set;}
公共双空气{get;set;}
}
公共类产品信息
{
来自{get;set;}的公共时间跨度时间
公共时间跨度时间_到{get;set;}
公共字符串乘积{get;set;}
}
公共类ReactorView
{
公共ReactorParameters参数{get;set;}
公共产品信息产品{get;set;}
}
///
///入口点
///
公开无效测试()
{
随机rnd=新随机数(1000);
//随机参数
列表参数=(从Enumerable.Range(0,24)中的i开始)
选择新的反应器参数
{
时间=时间跨度从小时(i),
温度=rnd.NextDouble()*50.0,
机油=rnd.NextDouble()*20.0,
Air=rnd.NextDouble()*30.0,
}).ToList();
//产品信息
列出产品=(从可枚举范围(0,4)中的i开始)
选择新产品信息
{
Time_From=时间跨度From小时(i*6),
Time_To=时间跨度从小时(i*6+6),
Product=“Product”+(char)('A'+i),
}).ToList();
//结合
var结果=参数。从产品中的产品中选择多个(参数=>
其中param.Time>=product.Time\u From&¶m.Time=product.Time\u From&¶m.Time您希望在列表框中(仅一列)还是网格中(多列)?@ANewGuyInTown我已经用一个自定义的DataTemplate
设置了一个ListBox
的样式。这个DataTemplate
包含一个Grid
和许多列。我在每个单元格中放置了一个TextBox
,因此结果看起来像是一个只读的DataGrid
。我的ListBox
已经显示了所有ReactorPa参数
,但缺少产品信息
。好吧,从我看来,创建一个“视图”类是可行的。我不是100%确定。感谢您的代码示例,SelectMany查询很简洁-我应该更经常地使用它。我添加了带有两个条件选择的可选查询,结果是相同的。
public class ProductReactorModel
{
public ReactorParameters ReactorParameters {get;set;}
public ProductInformation ProductInformation {get;set;}
}
{Binding ReactorParameters.Time}
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);
}
}