在Foreach中切换集合

时间:2015-01-21 10:24:33

标签: c# asp.net-mvc loops generics

两个集合都有ExternalIds。如果参数类型为1或2,我将如何更改foreach使用的集合。我是否必须执行两个单独的循环或者我可以以某种方式使用集合T?

        public ActionResult Details(string id, int type)
        {
           IEnumerable<Album> collection1 = ASR.Albums;
           IEnumerable<Track> collection2 = TSR.Tracks;


           foreach (var item in collection1)
           {
               var result = item.ExternalIds.SingleOrDefault(x => x.Id == id);
               if (result != null)
               {
                   return View(item);
               }
           }
           return View();
        }

3 个答案:

答案 0 :(得分:2)

创建一个与ExternalIds的接口作为成员,让Album和Track从该接口派生。

    public interface IExternalIds
    {
        public IEnumerable<SomeType> ExternalIds { get; }
    }

    public class Album: IExternalIds
    {
        ...
    }

    public class Track: IExternalIds
    {
        ...
    }

    public ActionResult Details(string id, int type)
    {
       IEnumerable<Album> collection1 = ASR.Albums;
       IEnumerable<Track> collection2 = TSR.Tracks;
       var collectionToUse = ((type == 1) ? collection1 : collection2)
        as IEnumerable<IExternalIds>;

       foreach (var item in collectionToUse)
       {
           var result = item.ExternalIds.SingleOrDefault(x => x.Id == id);
           if (result != null)
           {
               return View(item);
           }
       }
       return View();
    }

答案 1 :(得分:0)

我认为你希望他们拥有基类/接口。让我举例说明:

public interface IEntity
{
    public List<YourListType> ExternalIds { get; set; }
}

然后在两个类中实现IEntity接口:

public class Album : IEntity
{
    public List<YourListType> ExternalIds { get; set; }
}

完成此操作后,您可以将代码看起来像这样:

    public ActionResult Details(string id, int type)
    {
       IEnumerable<IEntity> collection1 = ASR.Albums;
       IEnumerable<IEntity> collection2 = TSR.Tracks;
       var collectionToUse = (type == 1) ? collection1 : collection2;

       foreach (var item in collectionToUse)
       {
           var result = item.ExternalIds.SingleOrDefault(x => x.Id == id);
           if (result != null)
           {
               return View(item);
           }
       }
       return View();
    }

因此,通过实现将在两个类中实现的接口,您可以使用在接口中声明的公共属性

我希望这能回答你的问题。

答案 2 :(得分:0)

专辑和曲目是否有共同的基本类型?如果是这样,你可以这样做:

IEnumerable<BaseType> collection = type == 1 ? ASR.Albums : TSR.Tracks;
foreach (var item in collection)
{
   ...
}

如果您没有公共基本类型,请创建一个界面,在foreach中添加您需要的公共属性,将其应用于AlbumTrack然后执行此类操作:

IEnumerable<IMusicInfo> collection = type == 1 ? ASR.Albums : TSR.Tracks;
foreach (var item in collection)
{
   ...
}

请记住要很好地命名您的界面,并仅添加在该界面中有意义的属性以实现良好的编码实践