Tag: collections

为什么有List .BinarySearch(…)?

我正在看List,我看到一个带有一些重载的BinarySearch方法,我不禁想知道在List中有这样的方法是否有意义? 除非列表已排序,否则为什么我要进行二进制搜索? 如果列表没有排序,调用该方法只会浪费CPU时间。 在List上使用该方法有什么意义?

防止重复列表条目

我希望我能够解决这个问题,但是我无法理解为什么这段代码无法正常运行并允许将重复的条目添加到List中。 即使我从同一位置拖动相同的文件,也永远不会满足if语句条件。 我不明白为什么“包含”方法不匹配它们。 public class Form1:Form { private List dragDropFiles = new List(); private void Form1_DragDrop(object sender, DragEventArgs e) { try { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); OutputDragDrop(files); } } catch { } } private void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; else e.Effect = DragDropEffects.None; } private void […]

为什么我在迭代时不应该修改集合

我知道.net集合类型(或至少一些集合类型)不允许在迭代时修改集合。 例如,在List类中存在如下代码: if (this.version != this.list._version) ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion); 但显然这是设计迭代器类的开发人员的决定,因为我可以提供IEnumerable一些实现,至少在修改底层集合时不抛出任何exception。 然后我有一些问题: 为什么我在迭代时不应修改集合? 可以创建一个支持在迭代时进行修改的集合,而不会有任何其他问题吗? (注意:第一个答案也可以回答这个问题) 当C#编译器生成Enumerator接口实现时考虑到这样的事情?

垃圾收集和引用C#

我有一个设计,我不确定垃圾收集是否会正确发生。 我有一些神奇的苹果,有些是美味的,有些是坏的。 我有一本字典: BasketList = Dictionary (篮子清单)。 每个Basket对象中都有一个Apple ,每个Basket存储一个对象AppleSeperation的引用。 AppleSeperation存储2个词典, YummyApples = 和BadApples = Dictionary ,所以当我被问到苹果在哪里时我知道。 Apple对象存储BasketsImIn = Dictionary ,它指向Basket和Shops,以及Apple in Basket。 我的问题是,如果我从BasketList删除一个篮子并确保从BadApples和/或YummyApples删除Apple, BadApples垃圾收集是否会正常发生,或者是否会出现一些混乱的引用?

创建可绑定到DataGrid的自定义集合

我在一家建筑公司工作,我正在创建一个3D建模程序的插件,以协助设计。 我有一个Building类和一个Floor类。 该建筑包含对FloorList楼层集合的引用。 我正在试图弄清楚FloorList集合的基础,这样我就可以最大限度地减少创建界面来编辑集合所需的工作量。 Floor系列代表一系列相互堆叠的建筑楼层。 每个楼层都有一个读写的Floor.Height属性,以及一个只读的Floor.Elevation属性,并通过总计当前楼层以下的楼层高度来设置。 因此,无论何时在集合中添加,删除,移动或更改Floor,都需要更新Floor.Elevation属性。 另外,我想创建一个用于编辑此集合的UI。 我正在考虑使用DataGrid控件,其中列出每个Floor的高度和其他属性作为控件的一行。 用户应该能够使用控件添加,删除和重新排序楼层。 我希望将其设置为尽可能简单灵活。 这意味着我只想简单地将Floors集合绑定到DataGrid,并根据Floor类的属性填充DataGrid的列。 如果可能的话,我希望能够利用DataGrid控件的内置添加/删除UI界面,而不必在我的集合和DataGrid之间设置一堆事件关系。 为了使将来进一步复杂化,我需要能够允许用户动态地将自定义属性添加到我希望他们能够在DataGrid中查看和编辑的Floors 。 我想我最终会通过让Floor类实现IExtenderProvider来实现这一点。 所以最终DataGrid看起来像这样: 初始属性未来自定义用户属性 高度提升程序类型UnitType UnitCount 15’70’住宅豪宅5 15’55’住宅豪宅5 15’40’住宅预算10 20’20’零售不适用2 20’0’零售不适用3 我现在的问题是我应该将FloorList集合作为基础来实现这一function? 我正在考虑的选项如下。 1)inheritance自列表(楼层) 诸如添加/删除之类的方法不是玻璃的,因此我不能覆盖它们来更新高程 2)实施IList(楼层) OnChange事件不是内置的,所以如果列表更改,DataGrid将不会更新(我认为?) 我认为这可能是最好的选择,但我需要做什么来确保对FloorList集合或DataGrid的更改彼此同步? 3)inheritance自BindingList(Floor) 添加/删除等方法不是虚拟的,因此我无法修改它们来更新楼层高程。 4)实现IBindingList IBindinglist不是通用的,我只希望我的集合包含Floor对象

在C#中使用F#数据类型

更具体地说,我真的想要一个不可变/共享的链表,我认为拥有不可变的地图和集合也会很好。 只要我不必担心核心实现,我就可以轻松添加扩展方法/子类/包装它,为我自己提供一个合理的外部接口。 我有什么理由不这样做吗? 性能,不兼容性等?

实例化generics类型?

我目前正在研究generics集合类,我想创建一个从集合中返回对象的方法。 如果集合中不存在特定对象,则应创建对象,将其添加到集合中,然后返回。 我遇到了一些问题。 generics集合if表示抽象类的类型,我在实例化时遇到问题。 这是我的class级定义: public class CacheCollection : List<CacheItem> where T : EntityBase 这是我工作的部分完整的方法: public T Item(int Id) { CacheItem result = this.Where(t => t.Entity.Id == Id).First(); if (result == null) //item not yet in cache, load it! { T entity = new T(Id); //design time exception here: Cannot create an instance of the […]

应用程序设置中的StringCollection不会被存储

我想使用StringCollection作为应用程序设置,但是在阅读它不是问题时,我发现没有存储设置。 如何使其工作? 任何解决方法? 这有什么问题? 我正在使用的代码: private static void AddToRecentProfiles(string path) { if (SpellCaster3.Properties.Settings.Default.RecentProfiles == null) SpellCaster3.Properties.Settings.Default.RecentProfiles = new StringCollection(); int index = SpellCaster3.Properties.Settings.Default.RecentProfiles.IndexOf(path); if (index >= 0) SpellCaster3.Properties.Settings.Default.RecentProfiles.Swap(index, 0); else SpellCaster3.Properties.Settings.Default.RecentProfiles.Insert(0, path); if (SpellCaster3.Properties.Settings.Default.RecentProfiles.Count > SpellCaster3.Properties.Settings.Default.MaxRecentProfiles) SpellCaster3.Properties.Settings.Default.RecentProfiles.RemoveAt(SpellCaster3.Properties.Settings.Default.RecentProfiles.Count – 1); SpellCaster3.Properties.Settings.Default.Save(); OnRecentProfilesChanged(SpellCaster3.Properties.Settings.Default.RecentProfiles, EventArgs.Empty); }

可迭代的集合,可以在迭代期间进行变异

Java中是否存在可以迭代的Java集合数据结构(以及C#),具有以下属性: 可以在不影响当前迭代器(已经启动的迭代器的迭代的其余部分)的情况下移除当前元素。 可以添加新元素,但也不会影响当前迭代器 – 当前迭代器的迭代仍在进行时,不会将其作为迭代值包含在内。 在我的情况下,每次迭代只会添加一个新元素,但是在从迭代中获取新的迭代器之前不应该看到任何元素。 元素的顺序无关紧要。 实际上,有一个传入列表和一个传出的项目列表。 传入列表被迭代,一些被复制到新列表。 在迭代期间,可以将一些新元素添加到新列表中。 迭代结束后,旧的传入列表将替换为新的传出列表。 整个过程本身就在一个循环中。 因此,与具有这些添加/删除属性的元素相比,每次将元素复制到新构造的集合对象似乎效率低下。 我有点想到某种队列,让我预览当前项目然后要么出列或不出列,然后转到下一项。 我可以在队列的头部添加更多项目,但是不会看到它们,因为我正在走向终点。 双重链表可能有这些属性,对吧? 如果你真的想知道它的用途,那就是在我的答案中加入第二个大代码块。

C#ObservableCollection OnCollectionChanged在项目更改时不触发

在MSDN上关于OnCollectionChanged:“在添加,删除,更改,移动项目或刷新整个列表时发生。” 我正在更改附加到我的集合中的obj的属性,但不会触发OnCollectionChanged。 我正在obj类上实现iNotifyPropertyChanged。 public class ObservableBatchCollection : ObservableCollection { protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { if(e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) { foreach (BatchData item in e.NewItems) { } } base.OnCollectionChanged(e); } public ObservableBatchCollection(IEnumerable items) : base(items) { } } 对我来说,这意味着当集合中的某个项目发生更改时(例如对象的属性),该事件应该触发。 然而,事实并非如此。 我希望能够知道我的自定义集合中的项目何时发生更改,以便我可以根据需要对其进行计算。 有什么想法吗?