C# 如何在一个列表中加入两个类?
我有这样的情况:C# 如何在一个列表中加入两个类?,c#,C#,我有这样的情况: List<Details> trace; private class Details { public string date { get; set; } public string type { get; set; } public string mex { get; set; } } private class Context { public List<object> context { get; set; } }
List<Details> trace;
private class Details
{
public string date { get; set; }
public string type { get; set; }
public string mex { get; set; }
}
private class Context
{
public List<object> context { get; set; }
}
列表跟踪;
私人课程详情
{
公共字符串日期{get;set;}
公共字符串类型{get;set;}
公共字符串mex{get;set;}
}
私有类上下文
{
公共列表上下文{get;set;}
}
如何在
跟踪
列表中插入类详细信息
和上下文
?我的目标是创建一个多维列表,其中包含类属性作为键,例如:date、type、mex、context
,以及作为动态内容的值 为此,您可以在两个类之间使用抽象契约。。。
例如,如果两个类都实现了一个新的接口,比如您定义的MyCustomInterface,那么将列表声明为list trace代码>然后您可以添加这两个类的对象
例子:
您可以使用Tuple
来保存列表中任一项的实例,但在迭代项时,您必须使用Item1
和此类名称来访问基础值:
List<Tuple<Details, Context>> trace;
// add
trace.Add(new Tuple(new Details(), new Context()));
// iterate
foreach(var item in trace)
if(item.Item1?.date == ... && item.Item2?.context != null) { ... }
并使用它
List<ContextDetails> trace;
// add
trace.Add(new ContextDetails()
{
Details = new Details(),
Context = new Context(),
});
// iterate
foreach(var item in trace)
if(item.Details?.date == ... && item.Context?.context != null) { ... }
列表跟踪;
//加
trace.Add(新的ContextDetails()
{
详细信息=新的详细信息(),
Context=新上下文(),
});
//迭代
foreach(跟踪中的变量项)
if(item.Details?.date==…&&item.Context?.Context!=null){…}
嗯,如果你真的想把两者都列在一个列表中,我会给你两个选择:
第一:
创建一个同时继承的父类。
下一步是将父类的名称放入列表中。
如果它们由相同的父类扩展,则两者都将适用
第二:
创建一个包含上下文和详细信息对象的对象,并将其放入列表。除非它们实现相同的基类/接口,否则这是一个可怕的想法。如果有人迭代您的列表试图访问详细信息
对象的上下文
属性,会发生什么情况?您需要提供更多信息。在这一点上,我想说您应该创建一个聚合类,该类包含详细信息
和上下文
的实例,但是如果不更好地理解您要做的事情,我就不能肯定这一点。我想您需要解释一下多维列表的含义,因为多维度的概念与固有的平面列表不匹配。为什么不创建一个封装详细信息和上下文的类呢?List
?因为这两个类之间没有共同点,所以我看不到使用接口的好处。为什么不使用对象
?似乎是一个很好的解决办法,但在这一点上,我知道我是否可以在不创建界面的情况下实现相同的目标,可能是使用另一个对象,不同于列表?此答案缺少如何访问此类列表项的示例(以演示设计问题)。如果OP考虑将两个类放在同一个列表中,那么它们肯定有一些共同点,可以在设计中采用更高的抽象级别…@ΦXoce웃Пepeúpa,普通?只是它们共享相同的父类-对象
。如果它们有任何共同之处,这将是一个很好的可扩展设计。至于现在,List
将是一个更好的主意,因为您不需要定义空的IMyCustomInterface
。元组很少是最好的方法。“考虑到Item1…ItemN的语义,它们很难使用。”我注意到DarrenYoung。
List<Tuple<Details, Context>> trace;
// add
trace.Add(new Tuple(new Details(), new Context()));
// iterate
foreach(var item in trace)
if(item.Item1?.date == ... && item.Item2?.context != null) { ... }
class ContextDetails
{
public Context { get; set; }
public Details { get; set; }
// todo: add constructor to simplify constructing items when adding
}
List<ContextDetails> trace;
// add
trace.Add(new ContextDetails()
{
Details = new Details(),
Context = new Context(),
});
// iterate
foreach(var item in trace)
if(item.Details?.date == ... && item.Context?.context != null) { ... }