我在教程中看到了很多,导航属性为ICollection<T>.
这是实体框架的强制性要求吗?我可以用IEnumerable吗?
使用ICollection代替IEnumerable甚至是什么的主要目的是List<T>什么?
在我首先设计一些Entity Framework应用程序之前,我只看了几个网络广播.我真的没有阅读那么多文档,我觉得我现在正在为此而痛苦.
我一直List<T>在我的课堂上使用,而且效果很好.
现在我已经阅读了一些文档,并说它应该一直在使用ICollection<T>.我改为这个,它甚至没有导致模型上下文改变.这是因为兼并List<T>和ICollection<T>继承IEnumerable<T>,这是EF实际需要的吗?
但是,如果是这种情况,为什么EF文档没有声明它需要IEnumerable<T>而不是ICollection<T>?
在任何情况下,我做了什么都有任何缺点,或者我应该改变它?
从ICollection获取值的最佳方法是什么?我们知道Collection除此之外是空的.
IEnumerable和之间有什么区别IEnumerable<T>?
我已经看到很多框架类实现了这两个接口,因此我想知道通过实现它们可以获得哪些优势?
请看看他们是如何定义的:
public interface IEnumerable
{
[DispId(-4)]
IEnumerator GetEnumerator();
}
public interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,IEnumerable<T>源于IEnumerable,这意味着无论IEnumerable有什么,IEnumerable<T>继承,那么为什么我们实现两者而不仅仅是IEnumerable<T>?实施IEnumerable<T>还不够吗?
同样,还有其他类似的对:
IList 和 IList<T> ICollection 和 ICollection<T>我也想知道这些.
我已经从配置文件中将设置名称及其各自的值提取到有序字典中.字典包含ICollection类的键和值.我想绑定该数据并将其显示在DataGridView中.我已经尝试将字符串复制到数组并显示这些数组,但是当我运行程序时,列是空白的,它似乎根本没有绑定.
我还尝试将DataGridView源直接设置为有序字典集合(键或值),但这也没有产生我想要的任何东西; 列仍然是空白的.但是,第三列的列名称为"length",并显示ICollection中条目的长度.但不用说我不想要长度,我想要条目本身.
这是我用于此问题的代码:在加载表单时,我加载配置文件,名为m_Settings的私有成员具有所有键值对.然后我创建一个列表并分别添加键和值.将绑定源设置为'data'后,我运行程序,我添加的两个列都是空白的.
private void Form4_Load(object sender, EventArgs e)
{
loadconfigfile(Properties.Settings.Default.Config);
List<Object> data = new List<Object>();
data.Add(m_Settings.Keys);
data.Add(m_Settings.Values);
bindingSource1.DataSource = data;
dataGridView1.DataSource = bindingSource1;
dataGridView1.Refresh();
}
Run Code Online (Sandbox Code Playgroud)
关于如何获得有序字典并在标有"设置"和"值"的两列中显示条目的任何想法?我相信列表是兼容DataGridViews的DataSources,但现在我开始猜测自己了.
任何帮助或方向非常感谢!如果需要,我很乐意提供更多信息.
谢谢!
编辑:
以下是已实现的myStruct类的修订代码:
List<myStruct> list = new List<myStruct>();
for(int index = 0; index < m_Settings.Count; index++)
{
myStruct pair = new myStruct(keys[index], values[index].ToString());
list.Add(pair);
}
public class myStruct
{
private string Key { get; set; }
private string Value { get; set; }
public myStruct(string key, string value)
{
Key …Run Code Online (Sandbox Code Playgroud) 遵循公共API永远不会返回列表的规则,我正在盲目转换返回列表的所有代码,ICollection<T>而是返回:
public IList<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
变
public ICollection<T> CommaSeparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
虽然a ICollection有a Count,但是没有办法通过该索引获取项目.
虽然ICollection公开了一个枚举器(允许foreach),但我不能保证枚举的顺序从列表的"顶部"开始,而不是"底部".
我可以通过避免使用来减轻这种情况ICollection,而是使用Collection:
public Collection<T> Commaseparate(String value) {...}
Run Code Online (Sandbox Code Playgroud)
这允许使用Items[index]语法.
不幸的是,我的内部实现构造了一个数组; 我可以被转换为返回IList或ICollection,但不作为Collection.
有没有办法按顺序访问集合的项目?
这引出了一个更广泛的问题:是否一个ICollection的,即使有订单?
从概念上讲,想象一下我想解析一个命令行字符串.保持物品的顺序至关重要.
从概念上讲,我需要一个表示"有序"字符串元组集的契约.在API合同的情况下,为了表明订单,以下哪项是正确的:
IEnumerable<String> Grob(string s)
ICollection<String> Grob(string s)
IList<String> Grob(string s)
Collection<String> Grob(string s)
List<String> Grob(string s)
Run Code Online (Sandbox Code Playgroud) 我需要设计自己的自定义GenericCollection类.现在我有很多选择使用以获得它IEnumerable,ICollection和IList,在后来提供了一些附加功能.
我很困惑,如果我和我一起去,IEnumerable<T>我可能需要声明对象实际上像这种情况一样持有集合_list.
public class GenericCollection<T> : IEnumerable<T>
{
private List<T> _list;
//...
}
Run Code Online (Sandbox Code Playgroud)
但是如果我使用ICollection<T>或者IList<T>,我不需要声明List对象,因为它是隐式可用的.
public class GenericCollection<T> : IList<T>
{
// no need for List object
//private List<T> _list;
//...
}
Run Code Online (Sandbox Code Playgroud)
这两种方法在性能方面有何不同?
在哪种情况下,每个人都是首选,特别是在设计自己的集合时.我对轻量级收藏感兴趣,性能良好.我认为这可以通过使用,IEnumerable<T>但是如何与一些强有力的理由一起使用呢?
我已经审查了一些现有的帖子,但没有提供所需的信息.
当我们将参数声明为ICollection并将对象实例化为List时,为什么我们无法检索索引?即
ICollection<ProductDTO> Products = new List<ProductDTO>();
Products.Add(new ProductDTO(1,"Pen"));
Products.Add(new ProductDTO(2,"Notebook"));Run Code Online (Sandbox Code Playgroud)
然后,这将无效:
ProductDTO product = (ProductDTO)Products[0];Run Code Online (Sandbox Code Playgroud)
我错过了什么?
[是的,我们可以使用List作为声明,它可以工作,但我不想声明为列表,如:
List<ProductDTO> Products = new List<ProductDTO>();Run Code Online (Sandbox Code Playgroud)
]
我读过一些博客文章提到,对于公共API,我们应该总是返回ICollection(或IEnumerable)而不是List.返回ICollection而不是List的真正优势是什么?
谢谢!
我目前正在编写一个C#项目,我需要对项目进行单元测试.对于我需要进行单元测试的方法之一,我使用ICollection,该ICollection通常从列表框的选定项中填充.
当我为方法创建单元测试时,它会创建该行
ICollection icollection = null; //Initialise to an appropriate value
Run Code Online (Sandbox Code Playgroud)
如何创建此ICollection的实例和集合中的项?
c# ×10
icollection ×10
ienumerable ×4
.net ×2
ilist ×2
list ×2
code-first ×1
collections ×1
datagridview ×1
datasource ×1
generics ×1
indexing ×1