如何在C#中指导Enumerable中的不规则课程?
How to instruct irregular course in Enumerable in C#?
Panagiotis Kanavos 在这个 SOF 问题中引入了以下聪明的解决方案来生成 LetterNumberNumber 模式:
var maxLetters=3; // Take 26 for all letters
var maxNumbers=3; // Take 99 for all the required numbers
var values=from char c in Enumerable.Range('A',maxLetters).Select(c=>(char)c)
from int i in Enumerable.Range(1,maxNumbers)
select String.Format("{0}{1:d2}",(char)c,i);
foreach(var value in values)
{
Console.WriteLine(value);
}
A01
A02
A03
B01
B02
B03
C01
二氧化碳
二氧化碳
D01
D02
D03
有没有办法在Enumerable的东西上指导不规则的课程? "Enumerable.Range(1, maxNumbers)" 引导 01、02、...、99(对于 maxNumbers 99)。
限制示例:
1. 将 (01,02,...,99) 限制为 (01,03,05,07,09,11,13)
2. 将 (01,02,...,99) 限制为 (02,04,06,08,10)
3. 将 (01,02,...,99) 限制为 (01,04,09,10)
我做了什么:
我工作 "Enumarable",尝试了它的方法,如:Enumerable.Contains(1,3,5,7,9,13) 给出了很大的错误,我无法达到:
A01, A03, A05, ....,Z09, Z11, Z13.
如果 Enumarable 不适合这类工作,你会提供什么来解决这个问题?
在我看来,您希望 Enumerable.Range(1, maxNumbers)
受特定条件的限制,而不是拥有所有整数。由于 Enumerable.Range()
生成 IEnumerable<int>
,您可以链接任何 LINQ 过滤方法调用,即 Enumerable.Where()
方法。例如,Enumerable.Range(1, 99).Where(x => x % 3 == 0)
会产生 (3,6,9,...99).
如果您只想要您指定的特定情况,其中列表仅包含 (1,3,5,7,9,13),您可以简单地制作一个包含所需数字的列表:new List<int> {1,3,5,7,9,13}
;你也可以使用 Enumerable.Range(1, maxNumbers).Where(x => x % 2 == 1)
和 maxNumbers = 13
.
这不是 C# 中的直接功能,而在 F# 中。
F# 示例:
[1..2..10]
将生成 [1,3,5,7,9] 的列表。
你第一个例子,"Restrict (01,02,...,99) only to (01,03,05,07,09,11,13)"可以用
实现
Enumerable.Range(1,99).Where(x => x % 2 == 1).Take(7);
第二个例子,"Restrict (01,02,...,99) only to (02,04,06,08,10)"可以用
实现
Enumerable.Range(1,99).Where(x => x % 2 == 0).Take(5);
而您的第三个示例 "Restrict (01,02,...,99) only to (01,04,09,10)" 似乎很奇怪。我不确定这里的模式是什么。如果最后一个元素不是错字,那么从1开始,递增3,然后递增5,然后递增1,看起来不清楚,但这里有一个方法可以完成。
public static IEnumerable<int> GetOddMutation(int start, int max, int count, List<int> increments) {
int counter = 0;
int reset = increments.Count - 1;
int index = 0;
int incremented = start;
while(counter < count) {
var previous = incremented;
incremented += increments[index];
index = index == reset ? 0 : index + 1;
counter++;
if(previous != incremented) //Avoid duplicates if 0 is part of the incrementation strategy. Alternatively, call .Distinct() on the method.
yield return incremented;
}
}
调用
GetOddMutation(1,99,4, new List<int> {0,3,5,1})
将导致 [1,4,9,10]
Panagiotis Kanavos 在这个 SOF 问题中引入了以下聪明的解决方案来生成 LetterNumberNumber 模式:
var maxLetters=3; // Take 26 for all letters
var maxNumbers=3; // Take 99 for all the required numbers
var values=from char c in Enumerable.Range('A',maxLetters).Select(c=>(char)c)
from int i in Enumerable.Range(1,maxNumbers)
select String.Format("{0}{1:d2}",(char)c,i);
foreach(var value in values)
{
Console.WriteLine(value);
}
A01 A02 A03 B01 B02 B03 C01 二氧化碳 二氧化碳 D01 D02 D03
有没有办法在Enumerable的东西上指导不规则的课程? "Enumerable.Range(1, maxNumbers)" 引导 01、02、...、99(对于 maxNumbers 99)。
限制示例:
1. 将 (01,02,...,99) 限制为 (01,03,05,07,09,11,13)
2. 将 (01,02,...,99) 限制为 (02,04,06,08,10)
3. 将 (01,02,...,99) 限制为 (01,04,09,10)
我做了什么:
我工作 "Enumarable",尝试了它的方法,如:Enumerable.Contains(1,3,5,7,9,13) 给出了很大的错误,我无法达到:
A01, A03, A05, ....,Z09, Z11, Z13.
如果 Enumarable 不适合这类工作,你会提供什么来解决这个问题?
在我看来,您希望 Enumerable.Range(1, maxNumbers)
受特定条件的限制,而不是拥有所有整数。由于 Enumerable.Range()
生成 IEnumerable<int>
,您可以链接任何 LINQ 过滤方法调用,即 Enumerable.Where()
方法。例如,Enumerable.Range(1, 99).Where(x => x % 3 == 0)
会产生 (3,6,9,...99).
如果您只想要您指定的特定情况,其中列表仅包含 (1,3,5,7,9,13),您可以简单地制作一个包含所需数字的列表:new List<int> {1,3,5,7,9,13}
;你也可以使用 Enumerable.Range(1, maxNumbers).Where(x => x % 2 == 1)
和 maxNumbers = 13
.
这不是 C# 中的直接功能,而在 F# 中。
F# 示例:
[1..2..10]
将生成 [1,3,5,7,9] 的列表。
你第一个例子,"Restrict (01,02,...,99) only to (01,03,05,07,09,11,13)"可以用
实现Enumerable.Range(1,99).Where(x => x % 2 == 1).Take(7);
第二个例子,"Restrict (01,02,...,99) only to (02,04,06,08,10)"可以用
实现Enumerable.Range(1,99).Where(x => x % 2 == 0).Take(5);
而您的第三个示例 "Restrict (01,02,...,99) only to (01,04,09,10)" 似乎很奇怪。我不确定这里的模式是什么。如果最后一个元素不是错字,那么从1开始,递增3,然后递增5,然后递增1,看起来不清楚,但这里有一个方法可以完成。
public static IEnumerable<int> GetOddMutation(int start, int max, int count, List<int> increments) {
int counter = 0;
int reset = increments.Count - 1;
int index = 0;
int incremented = start;
while(counter < count) {
var previous = incremented;
incremented += increments[index];
index = index == reset ? 0 : index + 1;
counter++;
if(previous != incremented) //Avoid duplicates if 0 is part of the incrementation strategy. Alternatively, call .Distinct() on the method.
yield return incremented;
}
}
调用
GetOddMutation(1,99,4, new List<int> {0,3,5,1})
将导致 [1,4,9,10]