Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带接口的列表中的通用列表_C#_List_Generics_Interface - Fatal编程技术网

C# 带接口的列表中的通用列表

C# 带接口的列表中的通用列表,c#,list,generics,interface,C#,List,Generics,Interface,我目前正在开发一个REST服务,它在我的CMS(Orchard)中创建页面和链接,这两个都需要放在我的菜单中 这是我当前的解决方案: public class ConfigurationDTO { public ShellSettings Tenant { get; set; } public SetupContext SetupContext { get; set; } public IList<IList<Page>> Pages { get;

我目前正在开发一个REST服务,它在我的CMS(Orchard)中创建页面和链接,这两个都需要放在我的菜单中

这是我当前的解决方案:

public class ConfigurationDTO
{
    public ShellSettings Tenant { get; set; }
    public SetupContext SetupContext { get; set; }
    public IList<IList<Page>> Pages { get; set; }
    public IList<IList<Link>> Links { get; set; }

    public ConfigurationDTO() { }
}
Link.cs

public class Link
{
    public string Url { get; set; }
    public string MenuText { get; set; }
    public string Culture { get; set; }
}
我有两个包含其他列表的列表。内部列表包含本地化项目(相同内容项目的英语、德语和法语版本)

我的大多数“元”代码对于链接和页面都是相同的,这就是我重构代码的原因

这是我的重构尝试(不起作用):

我的新名单

public IList<IList<IItem>> Items{ get; set; }
有没有办法从这个列表中获得一个特定的实现(如果它是一个页面,则创建一个新的页面条目,反之亦然)

编辑:我用同样的原理编写了一个小的示例程序,它可以工作,这意味着我的问题在其他地方

你可以看出这是我关于stackoverflow的第一篇文章,因为我只是告诉你什么不起作用,而不是什么实际问题。我的问题是主菜单中的顺序错误:

我想要的是: 第1页|第2页|链接1 |第3页

我得到的是: 第1页|第2页|第3页|链接1

我的代码创建所有页面,然后创建链接并将它们添加到菜单中。解决方法->每个项目都有一个订单属性。 我可能会在将来更改它,这样我只需要一个列表,但现在我的变通方法就足够了


无论如何,感谢所有人。

< P>您可以考虑使用LINQ方法<代码> OfType < /C> >将通用列表过滤到所需类型的列表的子集:

var pages = config.Items.OfType<Page>();
var links = config.Items.OfType<Link>();
var pages=config.Items.OfType();
var links=config.Items.OfType();
您可以阅读
of type的文档

您可以使用该文档将列表列表展平为单个列表,然后使用以下方法筛选特定类型:

var items = config.Items.SelectMany(x=>x);

var links = items.OfType<Link>();
var pages = items.OfType<Page>();
var items=config.items.SelectMany(x=>x);
var links=items.OfType();
var pages=items.OfType();

什么是
doSomething
doSomethingElse
?您确定不能通过多态性(即不同的实现,例如,
IItem.Create(someClient)
)实现这一点吗?
foreach (var item in config.Items)
        {
            foreach (var translation in item)
            {
                var page = translation as Page;
                if (page != null) doSomething();

                var link = translation as Link;
                if (link != null) doSomethingElse();
            }
        }
var pages = config.Items.OfType<Page>();
var links = config.Items.OfType<Link>();
var items = config.Items.SelectMany(x=>x);

var links = items.OfType<Link>();
var pages = items.OfType<Page>();