假设我有以下整数列表:
var numbers = new List<int> { 0, 0, 0, 27, 29, 24, 35, 33, 32, 1, 1, 1, 22, 55,
44, 44, 55, 59, 0, 0, 0, 0 };
我想实现以下描述的搜索算法。我正在寻找数字59。
44, 44, 55, 59, 0, 0, 0, 0
):我将如何在C#中实现此算法?这些是我的一些担忧:
while
或for
构造来迭代整个列表,但是有时我不得不从列表的末尾开始这一事实将导致索引混乱。我曾考虑过实现自定义IEnumerable/IEnumerator
来掩盖这种混乱,但是在这种情况下,我应该使用foreach
语句。但是,当我尝试处理此foreach
中上述的组时,我仍然会感到一团糟。注意:此示例不是家庭作业。这是一个简化的问题,旨在消除涉及复杂对象和条件的实际问题的不必要的细节。
假设我有以下整数列表:var number = new List
如果您熟悉LINQ,并且很容易编写未内置的LINQ方法,则此问题非常容易。
using System.Linq;
var source = new List<int> { 0, 0, 0, 27, 29, 24, 35, 33, 32, 1, 1, 1,
22, 55, 44, 44, 55, 59, 0, 0, 0, 0 };
var result = source
.SkipWhile(n => n == 0) // Leading 0s ignored
.GroupConsecutiveByKey(n => n / 10) // Next items having same tens grouped
.SkipWhile(g => g.Any(n => n % 2 == 0)) // Group containing an even number ignored
.Skip(1) // Next group ignored
.Where(g => !g.All(n => n == 1)) // 1s are ignored as well
.FirstOrDefault(g => g.Any(n => n % 10 == 9)) // Contains item ending in 9
.FirstOrDefault(n => n % 10 == 9); // Item ending in 9
Console.WriteLine($"Result: {result}");
您可以使用Linq,并进行一些自定义。您将需要实现一个反向枚举器,以便您可以使主要逻辑保持不变,而不管您是从左向右进行迭代,还是从左向右进行迭代。不要在大列表中使用Linq的Reverse
方法,因为它会首先迭代整个集合。
假设您有此列表:
var numbers = new List<int> { 0, 0, 0, 27, 29, 24, 35, 33, 32, 1, 1, 1, 55, 44, 44, 55, 59, 0, 0, 0, 0 };
@@ Theodor Zoulias使用LINQ给出了答案。
以下解决方案是更手动的: