为什么要使用ICollection的,而不是IEnumerable的或列表 在多对多/一对多的

2019-05-13 12:03发布

我此看到很多的教程,具有导航性能ICollection<T>

这是实体框架的强制要求? 我可以使用IEnumerable

什么是使用的主要目的ICollection ,而不是IEnumerable ,甚至List<T>

Answer 1:

通常你选择将取决于你需要访问哪些方法。 一般而言- IEnumerable<> (MSDN: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx )为对象的列表,仅需要通过,被迭代ICollection<> MSDN: http://msdn.microsoft.com/en-us/library/92t2ye13.aspx ),选择那些需要通过迭代和修改的对象的列表, List<>针对需要通过被迭代的对象的列表,修改,整理等(见这里的完整列表: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx )。

从更具体的角度来看,延迟加载进来与选择类型的发挥。 默认情况下,在实体框架导航性能配备了更改跟踪并代理。 为了使动态代理作为一个导航属性来创建,虚拟类型必须实现ICollection

表示的关系中的“多”端的导航属性必须返回实现ICollection的,其中T是所述物体的在所述关系的另一端的类型的类型。 - 用于创建POCO代理MSDN要求

在定义和管理关系MSDN更多信息



Answer 2:

ICollection<T>被使用,因为IEnumerable<T>接口提供没有添加项目,删除项目,或以其他方式修改集合的方式。



Answer 3:

在回答你的问题关于List<T>

List<T>是一类; 指定接口允许实现更大的灵活性。 一个更好的问题是“为什么不IList<T> ?”

为了回答这个问题,考虑什么IList<T>增加ICollection<T>整数索引,这意味着该物品具有一定的任意的顺序,并且可以通过参考该顺序进行检索。 这可能不是在大多数情况下有意义,因为可能的项目需要在不同的上下文不同的排序。



Answer 4:

还有的ICollection和IEnumerable之间的一些基础知识差

  • IEnumerable的 -只包含GetEnumerator方法获得枚举器并进行循环
  • ICollection的是包含以下的方法-添加/删除/包含/计数/ CopyTo从
  • 的ICollection从IEnumerable的继承
  • 随着ICollection的,你可以通过使用方法,如添加/删除,你不要有自由做同样的修改IEnumerable的集合。

简单的程序:

using System;
using System.Collections;
using System.Collections.Generic;

namespace StackDemo
{
    class Program 
    {
        static void Main(string[] args)
        {
            List<Person> persons = new List<Person>();
            persons.Add(new Person("John",30));
            persons.Add(new Person("Jack", 27));

            ICollection<Person> personCollection = persons;
            IEnumerable<Person> personEnumeration = persons;

            //IEnumeration
            //IEnumration Contains only GetEnumerator method to get Enumerator and make a looping
            foreach (Person p in personEnumeration)
            {                                   
               Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);
            }

            //ICollection
            //ICollection Add/Remove/Contains/Count/CopyTo
            //ICollection is inherited from IEnumerable
            personCollection.Add(new Person("Tim", 10));

            foreach (Person p in personCollection)
            {
                Console.WriteLine("Name:{0}, Age:{1}", p.Name, p.Age);        
            }
            Console.ReadLine();

        }
    }

    class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public Person(string name,int age)
        {
            this.Name = name;
            this.Age = age;
        }
    }
}


Answer 5:

使用的基本思想ICollection是提供一个接口为只读访问到的数据的一些有限的量。 事实上,你有一个ICollection.Count财产。 IEnumerable是更适合于其中阅读直到一些逻辑点的数据的一些链,一些条件esplicitly由消费者或直到枚举的端指定。



Answer 6:

我记得是这样的:

  1. IEnumerable的具有一个方法GetEnumerator(),它允许通过一个集合中的值来读取但不能写入。 大多数使用枚举的复杂性是由在C#中的每条语句照顾我们。 IEnumerable的有一个属​​性:当前,返回当前元素。

  2. 的ICollection实现IEnumerable,并增加了一些额外的性能最大程度地利用它的是伯爵。 将ICollection的通用版本实现了add()和删除()方法。

  3. IList的同时实现IEnumerable和ICollection的,并添加到项目的整数索引访问(通常不是必需的,排序在数据库中完成)。



Answer 7:

导航属性通常定义为虚拟的,这样他们可以利用某些实体框架的功能,例如迟缓装载。

如果导航属性可以容纳多个实体(如在许多一对多或一对一一对多关系),它的类型必须是哪些条目可以添加,删除和更新,如ICollection的列表。

https://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-framework-data-model-for-an-asp-net- MVC应用程序



Answer 8:

我在过去做的是申报使用我的内部类藏品IList<Class>ICollection<Class>IEnumerable<Class>取决于我是否会做任何数量的以下的(如果静态列表)方法在我的仓库: 枚举,排序/顺序或修改 。 当我只需要在对象枚举(也许排序),那么我创建一个临时List<Class>的IEnumerable的方法中使用的收集工作。 我想,如果集合相对较小这种做法只会是有效的,但它可能是很好的做法一般,IDK的。 如果有证据,为什么这会不是好的做法,请大家指正。



文章来源: Why use ICollection and not IEnumerable or List on many-many/one-many relationships?