Tag: collections

如何让KeyedCollection成为只读?

首先让我解释为什么我使用KeyedCollection。 我正在构建一个DLL,我有一个项目列表,我需要添加到一个集合,并让它们按照我放置它们的顺序保留,但我还需要通过它们的索引和键来访问它们(关键是我已定义的对象的属性)。 如果有任何其他更简单的集合,请告诉我。 好了,我需要能够在DLL内部向此集合中添加项目,但是我需要将它作为只读公开提供给DLL的最终用户,因为我不希望它们删除/更改我添加的项目。 我一直在这个网站,其他网站,谷歌搜索,我一直无法找到一种方法来获得某种只读的KeyedCollection。 我最接近的是这个页面( http://www.koders.com/csharp/fid27249B31BFB645825BD9E0AFEA6A2CCDDAF5A382.aspx?s=keyedcollection#L28 ),但我无法让它发挥作用。 更新: 我看了看那些C5课程。 这与你的其他评论一起帮助我更好地理解如何创建我自己的只读类,它似乎工作。 但是,当我尝试将常规版本转换为只读版本时,我遇到了问题。 我得到一个编译时无法转换错误。 这是我创建的代码(第一个小类是我最初的代码): public class FieldCollection : KeyedCollection { protected override string GetKeyForItem(Field field) { return field.Name; } } public class ReadOnlyFieldCollection : KeyedCollection { protected override string GetKeyForItem(Field field) { return field.Name; } new public void Add(Field field) { throw new ReadOnlyCollectionException(“This collection […]

隐藏DataGridView中的行,绑定在我的项目中不起作用

我在项目中面临一个关于DataGridView行隐藏的问题。 我粘贴的代码在一个单独的测试项目中工作,但不在我的项目中。 请帮帮我。 我正在测试的代码 public partial class frmTestGirdBinding : Form { CustomDataCollection cdata = new CustomDataCollection(); Random rnd = new Random(); public frmTestGirdBinding() { InitializeComponent(); } private void frmTestGirdBinding_Load(object sender, EventArgs e) { BindingSource bindingSource1 = new BindingSource(); bindingSource1.DataSource = cdata; dataGridView1.DataSource = bindingSource1; //bindingSource1.Filter = “Srno = 3”; not working CurrencyManager cm = (CurrencyManager)BindingContext[bindingSource1.DataSource]; […]

ConcurrentDictionary似乎在删除时不标记GC的元素

我惊讶地发现我的应用程序内存占用不断增长 – 运行的时间越长,消耗的内存就越多。 因此,通过windbg一些魔力,我根据ConcurrentDictionary向我的小LRU缓存指出了一个问题。 CD有很多好处,对我来说非常酷(其中一个是它的数据永远不会在LOH中结束)。 TryRemove和TryRemove是用于添加和逐出项目的两种方法。 一些旧元素的!gcroot引导我回到我的缓存。 ILSpy的一些调查让我得出了这样的结论: TryRemove并没有真正删除元素。 它只是改变链表指针以跳过从不将数组元素的值赋值为null 。 这可以防止GC收集旧的被驱逐的对象。 真? 这是一个已知的问题吗? 如果是这样,我唯一的选择是TryUpdate(key, null) ,然后是TryRemove(key) ? 如果是这样,那么我必须锁定ConcurrentDictionary访问,这是矛盾的。 这是ILSpy转储: // System.Collections.Concurrent.ConcurrentDictionary private bool TryRemoveInternal(TKey key, out TValue value, bool matchValue, TValue oldValue) { while (true) { ConcurrentDictionary.Tables tables = this.m_tables; int num; int num2; this.GetBucketAndLockNo(this.m_comparer.GetHashCode(key), out num, out num2, tables.m_buckets.Length, tables.m_locks.Length); lock (tables.m_locks[num2]) { […]

在ICollection <Tuple >上实现.Contains()的最简单方法

假设我有一个Dictionary<String, Tuple> ,我想确定任何一个字典值是否有T1的T1。 我怎样才能最优雅地做到这一点? LINQ?

我何时会在原生foreach循环中使用List .ForEach?

两种方法都有优势吗? 如果我需要遍历List项并对每个项执行操作,我应该使用传统的foreach循环机制还是继续使用List.ForEach? Matthew Podwysocki @ CodeBetter.com写了一篇关于反竞选活动的有趣文章。 这让我想到了循环试图解决的问题。 在本文中,Matthew认为显式循环结构会让你思考“如何”而不是“什么”。 使用一个优于另一个(如果有的话)有什么好的理由?

在C#中排队

虽然这个问题听起来像是重复的,但我搜索了很多但却找不到合适的解决方案。 我有以下课程 public enum ChangeType { Add, Modify, Delete } public enum ChangedObjectType { Project, Customer, Border, Photo } public struct ChangeInfo { public ChangeType typeofChange { get; private set; } public ChangedObjectType objectType { get; private set; } public string objectID { get; private set; } public ChangeInfo(ChangeType changeType, ChangedObjectType changeObj, string objectId):this() { […]

从DateTime对象集合中解析每月项目

我之前已经问过这个问题 ,可以收集日期时间对象,并按天和时间对它们进行分组 所以回顾一下:我收集了DateTime的集合 List collectionOfDateTime = GetDateColletion(); 然后通过dayofWeek和时间进行分组 var byDayOfWeek = collectionOfDateTime.GroupBy(dt => dt.DayOfWeek + “-” + dt.Hour + “-” + dt.Minute); 所以在这一点上,我按周分组(一致时间)完美地工作。 我现在有一个新的要求按月而不是按周分组。 当我说“月”时,它不是一个月的同一天,而是像“每个月的第一个星期二” 我试图弄清楚在一个组中使用什么“关键”来对所有符合月度逻辑的项目进行分组(本月的第一个星期二,每个月的第二个星期五等) 举个例子,我可以说这些日期开始了; var date1 = new DateTime(2013, 1, 4).AddHours(8); // This is the first Friday in Jan var date2 = new DateTime(2013, 2, 1).AddHours(8); // This is the first Friday […]

从词典中组合“检查添加或提取”

我厌倦了这个字典成语: Dictionary Contacts; //… if (!Contacts.ContainsKey(id)) { contact = new Contact(); Contacts[id] = contact; } else { contact = Contacts[id]; } 如果有一种语法允许从默认构造函数隐式创建新值,如果它不存在(字典知道值的类型,毕竟),那将是很好的。 有人看过帮助者(例如扩展方法)吗?

有两个键和一个对象的最佳C#集合是什么?

我有一个MenuManager类,每个模块可以添加一个键和要加载到主要内容中的元素: private Dictionary _mainContentItems = new Dictionary(); public Dictionary MainContentItems { get { return _mainContentItems; } set { _mainContentItems = value; } } 所以客户模块注册它的视图如下: layoutManager.MainContentViews.Add(“customer-help”, this.container.Resolve()); layoutManager.MainContentViews.Add(“customer-main”, this.container.Resolve()); 所以后来我在前面带了一个特定的视图我说: layoutManager.ShowMainContentView(“customer-help”); 为了获得默认视图(第一个注册视图),我说: layoutManager.ShowDefaultView(“customer”); 这很好用。 但是,我想用连字符消除“代码味道”,它将模块名称和视图名称分开,所以我想注册这个命令: layoutManager.MainContentViews.Add(“customer”,”help”, this.container.Resolve()); 但是更换我当前词典的最佳方法是什么,例如我想到的是: Dictionary (doesn’t exist) Dictionary<KeyValuePair, object> Dictionary 新的集合需要能够做到这一点: 获取带模块和视图键的视图(例如“customer”,“help”返回1视图) 按模块键获取所有视图的集合(例如“customer”返回5个视图)

C# – 需要一个允许空键的IDictionary实现

基本上,我想要这样的东西: Dictionary dict = new Dictionary(); dict.Add(null, “Nothing”); dict.Add(1, “One”); 是否有任何内置到基类库中允许这样做? 添加null键时,上面的代码将在运行时抛出exception。 谢谢