我想做的是,给定一个数组,选择在列表中具有偶/奇索引的项目。
我会更好地解释:如果我有一个像let transport = nodemailer.createTransport(config.smtp);
log4js.configure({
appenders: {
email: {
type: '@log4js-node/smtp',
SMTP: config.smtp,
transport,
recipients: '3@ethereal.email'
}
},
categories: { default: { appenders: ['email'], level: 'error' } }
});
这样的数组,我想将所有[1,4,6,2,8]
(位置为零,数组(在这种情况下为evenList
)中的两个,四个等)。
奇数物品也一样。
我已经开发了以下代码,但仍然遇到问题。
even position
我期望1,6,8
将包含class CheckItem
{
static readonly string myNumber = "5784230137691";
static int[] firstTwelveList = new int[12];
static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
static int[] arrayOddPosition = new int[(myNumber.Length / 2)];
static readonly int idx = 0;
public static void Position()
{
firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();
foreach (var even in firstTwelveList)
{
if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here...
{
Array.Copy(firstTwelveList, arrayEvenPosition, (myNumber.Length / 2));
}
}
Console.ReadLine();
}
}
和arrayEvenPosition
5,8,2,0,3,6,1
答案 0 :(得分:2)
对于您的任务,我认为for
循环的基本形式比foreach
更好。
int j=0;
int k=0;
for (int i=0; i<firstTwelveList.Length; i++) {
if (i % 2 == 0) {
arrayEvenPosition[j++] = firstTwelveList[i];
} else {
arrayOddPosition[k++] = firstTwelveList[i];
}
}
请注意,我的代码不是完整的解决方案,而只是您应该做什么的想法。 祝你好运!
答案 1 :(得分:1)
尝试 Linq :
firstTwelveList = myNumber
.Take(12)
.Select(c => c - '0')
.ToArray();
arrayEvenPosition = firstTwelveList
.Where((item, index) => index % 2 == 0)
.ToArray();
arrayOddPosition = firstTwelveList
.Where((item, index) => index % 2 != 0)
.ToArray();
答案 2 :(得分:0)
其他答案是正确的,因为有更简单的方法可以根据索引(奇数/偶数)将数组拆分为两个数组。但是我注意到您的代码有两个问题。
if(Array.IndexOf(firstTwelveList, idx) % 2 == 0) //never enter here..
IndexOf的两个参数是数组和要查找元素索引的项目,idx不是正确的参数。它应该是foreach循环中的even
变量
第二次将正确的值复制到另一个数组时,您正在将第一个数组的前6个字符复制到新数组中。
引用Array.Copy(Array, Array, Int32)的参考文档,它只是将所需范围的元素从第一个数组复制到第二个数组。
因此,您需要修改代码以复制满足偶数/奇数条件的元素。为此,您需要一个变量来跟踪新数组的当前索引
可以通过这种方式修改整个类
class CheckItem
{
static readonly string myNumber = "5784230137691";
static int[] firstTwelveList = new int[12];
static int[] arrayEvenPosition = new int[(myNumber.Length / 2)];
static int[] arrayOddPosition = new int[(myNumber.Length / 2)];
static int idx = 0;
static int evenIdx = 0; // track current index of new array
public static void Position()
{
firstTwelveList = myNumber.Substring(0, 12).Select(c => c - '0').ToArray();
foreach (var even in firstTwelveList)
{
if (Array.IndexOf(firstTwelveList, even) % 2 == 0) // replace idx with even...
{
Array.Copy(firstTwelveList, idx, arrayEvenPosition, evenIdx, 1); // copy the element from the current index of first array to new array
evenIdx++;
}
idx++;
}
Console.ReadLine();
}
}