Tag: reverse

如何反转包含代理项对的字符串

我写过这个方法来反转一个字符串 public string Reverse(string s) { if(string.IsNullOrEmpty(s)) return s; TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(s); var elements = new List(); while (enumerator.MoveNext()) { var cs = enumerator.GetTextElement().ToCharArray(); if (cs.Length > 1) { elements.AddRange(cs.Reverse()); } else { elements.AddRange(cs); } } elements.Reverse(); return string.Concat(elements); } 现在,我不想开始讨论如何提高代码效率或者如何使用一个代替我的代码。 我知道你可以执行Xors和各种其他事情来改进这段代码。 如果我想稍后重构代码,我可以轻松地完成,因为我有unit testing。 目前,这正确地反转了BML字符串(包括带有像”Les Misérables” “Les Mise\u0301rables”这样的重音符号的字符串)和包含组合字符的字符串,例如”Les Mise\u0301rables” 。 我的测试包含代理对,如果它们表达如此 Assert.AreEqual(“𠈓”, _stringOperations.Reverse(“𠈓”)); 但如果我表达这样的代理人对 […]

为什么Reverse for List和IEnumerable有两个完全不同的版本?

对于List对象,我们有一个名为Reverse()的方法。 它反转了“就地”列表的顺序,它不会返回任何内容。 对于IEnumerable对象,我们有一个名为Reverse()的扩展方法。 它返回另一个IEnumerable。 我需要以相反的顺序遍历列表,所以我不能直接使用第二种方法,因为我得到一个List,我不想反转它,只是向后迭代。 所以我可以这样做: for(int i = list.Count – 1; i >=0; i–) 要么 foreach(var item in list.AsEnumerable().Reverse()) 我发现它的可读性低于我拥有IEnumerable时的可读性 foreach(var item in list.Reverse()) 我无法理解为什么这两种方法以这种方式实现,名称相同。 这很令人讨厌和困惑。 为什么在Reverse()中没有一个名为BackwardsIterator()的扩展名为所有IEnumerable工作? 我对这种选择的历史原因非常感兴趣,而不是“怎么做”的东西!