Tag: collections

C#如何为集合创建公共getter和setter以及私有方法?

我想要一个带有(例如)SortedList集合“SrtdLst”属性的类“A”,并且在这个类“A”中允许添加或减少“SrtdLst”项。 但是在类“A”的实例中,只允许获取或设置项目的内容,而不是添加新项目或减去现有项目。 在代码中: class A { public SortedList SrtdLst = new SortedList(); public A() { // This must work: SrtdLst.Add(“KeyA”, “ValueA”); // This too: SrtdLst[“KeyA”] = “ValueAAA”; } } class B { public A a = new A(); public B() { // I want the following code to fail: a.SrtdLst.Add(“KeyB”, “ValueB”); // But this must […]

如何创建返回集合的XAML标记扩展

我正在使用XAML序列化作为对象图(在WPF / Silverlight之外),我正在尝试创建一个自定义标记扩展,它允许使用对XAML中其他地方定义的集合的选定成员的引用来填充集合属性。 这是一个简化的XAML片段,演示了我的目标: 每个Country对象的Languages属性将使用IEnumerable 填充,其中包含对LanguageSelector中指定的Language对象的引用,该对象是自定义标记扩展。 以下是我尝试创建将在此角色中使用的自定义标记扩展: [ContentProperty(“Items”)] [MarkupExtensionReturnType(typeof(IEnumerable))] public class LanguageSelector : MarkupExtension { public LanguageSelector(string items) { Items = items; } [ConstructorArgument(“items”)] public string Items { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { var service = serviceProvider.GetService(typeof(IXamlNameResolver)) as IXamlNameResolver; var result = new Collection(); foreach (var item in Items.Split(new[] { ‘,’ […]

确定两个List 对象是否包含相同的值集,即使它们的顺序不同,最好的方法是什么?

我有两个List对象(其中T对于两个对象都是相同的类型),我需要能够确定它们是否包含相同的值集,即使值不是相同的顺序。 对象是否有任何内置机制来完成此任务,或者我是否需要编写自己的算法? 或许,我应该使用不同类型的集合,而不是List ? 如果我要编写自己的算法,它可能包含以下步骤 – 如果我走这条路线,我会尝试在最终版本中优化它: 这两个集合是否包含相同数量的值? 如果没有返回false。 计算每个值在每个集合中出现的次数,如果计数不相等则返回false。 如果我到达两个集合的末尾而没有值计数的任何不等,则返回true。 我知道这有一些注意事项,比如T必须具有可比性 – 我现在使用默认比较(例如.Equals() ),并为generics类型定义了适当的约束。

从C#引用VBA程序集的运行时错误

我有一个C#.NET 3.5项目,遗憾的是它依赖于几个VB6 ActiveX控件。 到目前为止,我已经能够愉快地访问ActiveX控件中定义的数据容器和方法,只需添加对项目中控件的引用并正常引用它们即可。 然而,当我不得不调用一个返回VBA.Collection的方法时,我遇到了麻烦。 我的代码将编译没有问题,但在运行时我收到以下错误: 无法加载文件或程序集“Interop.VBA,Version = 6.0.0.0,Culture = neutral,PublicKeyToken = null”或其依赖项之一。 该系统找不到指定的文件。 我在项目中引用了Interop.VBA(版本6.0.0.0)和Interop.VBRUN(版本6.0.0.0),有什么想法吗? 我不能给出具体的代码,它包含在NDA中。 但是,这里是来自对象浏览器的示例代码,其名称已更改为保护不那么无辜;) 我可以从我的代码中引用以下属性和方法: ReturnConstants GoodMethod(); string prop1 ReturnConstants prop2 如果我尝试可以调用此方法,我在运行时收到上面的错误消息: Collection BadMethod(); 因此调用返回导致问题的VBA.Collection的方法。 这些是我无法控制的第三方控件,它们不会在.net中重写 编辑:出于兴趣,我去了VS2010尝试了一个快速的虚拟项目,并按预期工作完美,所以看起来这可能是VS2012的一个问题。 我看过一些post暗示2012年没有正确创建VBA的interops,所以我会去看看我能在那里找到什么……

将ListBox.SelectedObjectCollection转换为ListBox.ObjectCollection?

是否可以将ListBox.SelectedObjectCollection转换为C#中的ListBox.ObjectCollection? 如果是这样,我该怎么做呢?

如何向SqlParameter Collection添加新参数?

我想使用类似这样的东西: using (DataSet ds = new DataSet()) { SqlParameter[] dbParams = new SqlParameter[] { new SqlParameter(“@PromptID”, promptID) }; if (scenarioID != 0) dbParams.Concat(new SqlParameter(“@ScenarioID”, scenarioID)); //OR if (scenarioID != 0) dbParams.Add(new SqlParameter(“@ScenarioID”, scenarioID)); } } 我已经搜索过添加IEnumarable集合,但它并没有解决我的问题。 我应该创建两个集合并连接它们吗? 我认为必须有一种简单的方法来添加项目。 有什么建议?

在树结构上实现IEnumerable

根据这些家伙的工作: http://dvanderboom.wordpress.com/2008/03/15/treet-implementing-a-non-binary-tree-in-c/ http://www.matthidinger.com/archive/2009/02/08/asp.net-mvc-recursive-treeview-helper.aspx 我正在尝试实现一个可以这样使用的TreeView助手: r.Children, r => r.ID) %> 树结构的定义如下: public class Tree : TreeNode where T : TreeNode { } public class TreeNode : IDisposable where T : TreeNode { public T Parent { get; set; } public TreeNodeList Children { get; set; } } public class TreeNodeList : List<TreeNode> where T : TreeNode […]

为什么集合初始化会引发NullReferenceException

以下代码抛出NullReferenceException : internal class Foo { public Collection Items { get; set; } // or List } class Program { static void Main(string[] args) { new Foo() { Items = { “foo” } // throws NullReferenceException }; } } 为什么收集initiliazers在这种情况下不起作用,虽然Collection实现了Add()方法,为什么抛出NullReferenceException? 是否可以使集合初始化程序工作,或者是Items = new Collection() { “foo” }初始化它的唯一正确方法?

合并2个列表

例如,我有这两个列表: List firstName = new List(); List lastName = new List(); 如何连接firstName [0]和lastName [0],firstName [1]和lastName [1]等,并将其放入新列表?

清除私人collections或将其设为空?

我有一个可变类,里面有一个私有的List字段。 在我的类的Reset()方法中,我应该使用其Clear()方法Clear()列表还是仅为其字段分配一个新列表? 请注意,该列表不是公共的,仅供类本身使用。 因此,分配新列表应该使旧的列表无法访问。 由于Clear()方法是一个O(n)操作 ,我想知道只是在它上面分配一个新列表的缺点是什么。