Tag: 迭代

迭代HashSet的最快/最安全的方法是什么?

我还是C#的新手,但是在特定情况下通过论坛发帖使用HashSet而不是List来注意到这些优势。 我目前的情况并不是说我在一个List存储了大量的数据,而是我不得不经常检查它的成员。 问题是我确实需要迭代它,但它们存储或检索的顺序实际上并不重要。 我已经读过,因为每个循环实际上比下一个循环慢,所以我怎么能用尽可能快的方法来解决这个问题呢? 我正在做的.Contains()检查的数量肯定会损害我的列表性能,所以至少与HashSet的性能相比会很方便。 编辑:我目前正在使用列表,在许多位置迭代它们,并且在每个位置执行不同的代码。 大多数情况下,当前列表包含点坐标,然后我用它来引用二维数组,然后根据列表的标准执行某些操作或其他操作。 如果我的问题没有直接的答案,那很好,但我认为可能有其他方法迭代HashSet而不仅仅是foreach循环。 我目前处于黑暗状态,甚至可能有其他方法,它们提供了哪些优势等等。假设还有其他方法,我还假设有一种典型的首选方法,只有在它不能满足需求(我的需求非常基本)。 至于过早优化,我已经知道使用列表,因为我是一个瓶颈。 如何解决这个问题是我陷入困境的地方。 甚至没有完全卡住,但我不想通过重复测试来重新发明轮子只是为了发现我已经尽力做到这一点(这是一个投资超过3个月的大型项目,列表无处不在,但肯定有一些我不想重复,有大量数据,不需要以任何特定顺序存储,等等。

迭代C#中的Regex字典

我有一个函数,可以找到并替换输入字符串text的正则表达式 public static string Replacements(string text) { string output = Regex.Replace(text, @”\b[a-zA-Z0-9.-_]+@[az][A-Z0-9.-]+\.[a-zA-Z0-9.-]+\b”,”email”); return output; } 假设我想将替换正则表达式放入字典中 static Dictionary dict1 = new Dictionary { {@”^(\+\d{1,2}\s)?\(?\d{3}\)?[\s.-]\d{3}[\s.-]\d{4}$”, “phoneno”}, {@”\b[a-zA-Z0-9.-_]+@[az][A-Z0-9.-]+\.[a-zA-Z0-9.-]+\b”,”email”}, }; 我想迭代字典来替换文本。 我该怎么办? 我在这里尝试使用forloop的解决方案: 在C#中迭代Dictionary的最佳方法是什么? public static string Replacements(string text) { string output = text; foreach (KeyValuePair item in dict1) { output = Regex.Replace(text, item.Key, item.Value); } return output; […]

通过面板C#中的文本框控件进行迭代

我见过很多其他类似问题,但我在这里找不到我的逻辑中的缺陷。 任何帮助将不胜感激。 我有一个Panel,我已经添加了许多标签和文本框控件,即: myPanel.Controls.Add(txtBox); 这些控件是在迭代方法之前调用的方法中创建和添加的。 我想迭代每个文本框并使用其Text属性作为另一种方法中的参数,但我没有任何运气。 这是我尝试迭代: public void updateQuestions() { try { foreach (Control c in editQuestionsPanel.Controls) { if (c is TextBox) { TextBox questionTextBox = (TextBox)c; string question = questionTextBox.Text; writeNewQuestionToTblQuestions(question); } } } catch (Exception err) { Console.WriteLine(err.Message); } } 我遇到的问题是,当我到达这个updateQuestions()方法时,控件不在Panel中。 这是涉及的过程: 单击一个commandButton并从数据库中读取问题,对于每个问题调用一个方法,该方法将2个标签和一个文本框添加到editQuestionsPanel.Controls。 此面板位于PlaceHolder内,然后可以看到。 单击PlaceHolder中的按钮时,将调用updateQuestions()方法,并且editQuestionsPanel.Controls.Count = 1.由于DB中大约有12个问题,因此应该是36左右.Three中的一个控件是类型: System.Web.UI.LiteralControl 它不包含任何控件。 我确信在生命周期中,Panel的控件正在被清除,但我不知道如何跨越生命周期。 我有一个Page_load方法,只要单击一个按钮就会调用它但是一旦调用了updateQuestions()的按钮,editQuestionsPanel.Controls.Count已经回到1,所以必须在此之前清除但我不知道如何纠正这个…… 任何帮助你可以帮助我解决这个问题将不胜感激 […]

Bin Tree Post Order Traversal,No recursion,no node flag

还有另一种方法吗? 花了2个小时试图搞清楚。 我有一个解决方案(参见下面的DumpPostOrder)但是,有更好或更有效的方法吗? 感觉可能有。 规则是 – 没有递归,节点不能有访问标志。 即,你只能使用左+右成员。 我的方法是在这个过程中破坏树。 通过将每一边的子节点设置为null,您可以将节点标记为遍历一次,但我也会查看每个节点有两次子节点:(。有更好的更快方式吗?(对我的预订和顺序实现的评论表示赞赏)但没有必要(即投票,但没有标记答案)。谢谢! using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace BinaryTreeNoRecursion { public class TreeNode { public T Value { get; set; } public TreeNode Left { get; set; } public TreeNode Right { get; set; } public TreeNode(T inValue) { Value = inValue; } public […]

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

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

如何遍历所有文本框并使它们从动作字典中运行相应的操作?

我有大约60个文本框,当每个文本框都有自己的代码部分时,它会很乱。 对于某些事件,操作是相同的,而对于其他事件,可以有一个包含操作的字典。 问题是我不知道如何遍历文本框,获取当前文本框引用并运行一些方法来更改当前文本框的文本。 UPD:我要做的是让所有文本框运行AllTextboxesEnter方法,该方法将根据文本框的名称更改其文本,运行AllTextboxesLeave方法,该方法将根据文本框的名称从操作字典执行某些操作。

如何从TreeView中有效删除已检查的项目?

如何轻松遍历TreeView中的所有节点,检查其.Checked属性,然后删除所有已检查的节点? 它似乎很简单,但你不应该修改你正在迭代的集合,从而消除了“foreach”循环的可能性。 (.Nodes.Remove调用正在修改集合。)如果尝试这样做,效果是只有大约一半的.Checked节点被删除。 即使一个人使用两个传递:首先创建一个临时索引列表,然后在第二次传递时通过索引删除 – 每次删除时索引都会改变,从而使索引列表的完整性无效。 那么,最有效的方法是什么? 下面是一个看起来不错的代码示例,但实际上只删除了大约一半的.Checked节点: foreach (TreeNode parent in treeView.Nodes) { if (parent.Checked) { treeView.Nodes.Remove(parent); } else { foreach (TreeNode child in parent.Nodes) { if (child.Checked) parent.Nodes.Remove(child); } } } (是的,目的只是从两层深度的树中修剪节点。)

迭代变量和查找特定类型的实例的技术

我想在我的进程中迭代内存中的变量(通过动态加载),并查找特定类型的实例。 以前我可以找到特定类型(或内存中的所有类型)。 我可以创建类型的实例,我可以获得包含在不同类型的字段中的实例,但我不知道只是为了“搜索”特定类型的实例。

将嵌套的for循环转换为单个LINQ语句

有人可以帮我把这个嵌套结构变成一个LINQ语句吗? EventLog[] logs = EventLog.GetEventLogs(); for (int i = 0; i < logs.Length; i++) { if (logs[i].LogDisplayName.Equals("AAA")) { for (int j = 0; j < logs[i].Entries.Count; j++) { if (logs[i].Entries[j].Source.Equals("BBB")) { remoteAccessLogs.Add(logs[i].Entries[j]); } } } }

C#中的并行迭代?

有没有办法在C#中对并行枚举进行foreach样式迭代? 对于可订阅列表,我知道可以使用常规for循环迭代索引范围内的int,但出于多种原因我更喜欢foreach 。 奖励积分如果它在C#2.0中有效