C# 向数组中添加字符串

C# 向数组中添加字符串,c#,arrays,C#,Arrays,我正在尝试将字符串添加到数组中,我做了大量的研究,并提出了两个选项,但都不起作用,我得到了一个弹出窗口,详细信息使它听起来像我的数组超出了范围,这两种方法都在我的addSpam函数中。有没有关于如何修复这两种方法的想法 namespace HW8_DR { class Tester : Spam_Scanner { private string[] spam = {"$$$", "Affordable", "Bargain", "Beneficiary", "Be

我正在尝试将字符串添加到数组中,我做了大量的研究,并提出了两个选项,但都不起作用,我得到了一个弹出窗口,详细信息使它听起来像我的数组超出了范围,这两种方法都在我的addSpam函数中。有没有关于如何修复这两种方法的想法

namespace HW8_DR
{
    class Tester : Spam_Scanner
    {
        private string[] spam = {"$$$", "Affordable", "Bargain", "Beneficiary", "Best price", "Big bucks",
                                 "Cash", "Cash bonus", "Cashcashcash", "Cents on the dollar", "Cheap", "Check",
                                 "Claims", "Collect", "Compare rates", "Cost", "Credit", "Credit bureaus",
                                 "Discount", "Earn", "Easy terms", "F r e e", "Fast cash", "For just $XXX",
                                 "Hidden assets", "hidden charges", "Income", "Incredible deal", "Insurance",
                                 "Investment", "Loans", "Lowest price", "Million dollars", "Money", "Money back",
                                 "Mortgage", "Mortgage rates", "No cost", "No fees", "One hundred percent free",
                                 "Only $", "Pennies a day", "Price", "Profits", "Pure profit", "Quote", "Refinance",
                                 "Save $", "Save big money", "Save up to", "Serious cash", "Subject to credit",
                                 "They keep your money – no refund!", "Unsecured credit", "Unsecured debt",
                                 "US dollars", "Why pay more?"};
        public static double countSpam = 0;
        public static double wordCount = 0;
        public static string posSpam = "";

        public void tester(string email) 
        {
            for(int i = 0; i < spam.Length-1; i++)
                if(email.Contains(spam[i]))
                {
                    countSpam++;
                    posSpam = string.Concat(posSpam, spam[i], "\r\n\r\n");
                }
            wordCount = email.Split(' ').Length;
        }

        public void addSpam(string spamFlag)
        {
            //attempt 1 to add string to spam array
            Array.Resize(ref spam, spam.Length + 1);
            spam[spam.Length] = spamFlag;

            //attempt 2 to add string to spam array
            string[] temp = new string[spam.Length + 1];
            Array.Copy(spam, temp, spam.Length);
            temp.SetValue(spamFlag, spam.Length);
            Array.Copy(temp, spam, temp.Length);
        }
    }
}`
namespace HW8\u DR
{
类别测试员:垃圾邮件扫描器
{
私有字符串[]垃圾邮件={“$$”,“价格合理”,“便宜”,“受益人”,“最优惠价格”,“大美元”,
“现金”、“现金红利”、“现金”、“一美元一美分”、“便宜”、“支票”,
“索赔”、“收取”、“比较费率”、“成本”、“信用”、“信用局”,
“折扣”、“赚取”、“优惠条款”、“F r e”、“快速现金”、“仅需XXX美元”,
“隐藏资产”、“隐藏费用”、“收入”、“不可思议的交易”、“保险”,
“投资”、“贷款”、“最低价格”、“百万美元”、“金钱”、“退款”,
“抵押”、“抵押利率”、“无成本”、“无费用”、“百分之百免费”,
“仅美元”、“一天一便士”、“价格”、“利润”、“纯利润”、“报价”、“再融资”,
“节省美元”、“节省大笔资金”、“节省多达”、“大量现金”、“以信用为准”,
“他们保管您的钱-不退款!”、“无担保信贷”、“无担保债务”,
“美元”,“为什么支付更多?”};
公共静态双计数spam=0;
公共静态双字数=0;
公共静态字符串posSpam=“”;
公共无效测试仪(字符串电子邮件)
{
对于(int i=0;i
DLeh的答案是最好的-这就是
列表的作用,所以这就是您的解决方案

但失败的原因是您试图访问的索引比数组的最大索引高一个。最高索引总是比长度小一,因为数组是基于零的

int[] arr = new[] { 1, 2, 3 };
Console.WriteLine(arr.Length); // 3
Console.WriteLine(arr[0]); // 1
Console.WriteLine(arr[1]); // 2
Console.WriteLine(arr[2]); // 3
Console.WriteLine(arr[3]); // Exception
要访问数组中的最后一项,您需要使用:

var lastItem = arr[arr.Length - 1];
// or
var lastItem = arr[arr.GetUpperBound(0)];

DLeh的答案是最好的-这就是
列表的用途,所以这就是您的解决方案

但失败的原因是您试图访问的索引比数组的最大索引高一个。最高索引总是比长度小一,因为数组是基于零的

int[] arr = new[] { 1, 2, 3 };
Console.WriteLine(arr.Length); // 3
Console.WriteLine(arr[0]); // 1
Console.WriteLine(arr[1]); // 2
Console.WriteLine(arr[2]); // 3
Console.WriteLine(arr[3]); // Exception
要访问数组中的最后一项,您需要使用:

var lastItem = arr[arr.Length - 1];
// or
var lastItem = arr[arr.GetUpperBound(0)];

简单的解决方案:不要使用数组<代码>列表
更适合于此

using System.Collections.Generic;
...
private List<string> spam = {"$$$", "Affordable", "Bargain", "Beneficiary", ... }

...

public void addSpam(string spamFlag)
{
    spam.Add(spamFlag);
}
使用System.Collections.Generic;
...
私人列表垃圾邮件={“$$”、“价格合理”、“便宜”、“受益人”、…}
...
公共void addSpam(字符串spamFlag)
{
spam.Add(spamFlag);
}

简单的解决方案:不要使用数组<代码>列表
更适合于此

using System.Collections.Generic;
...
private List<string> spam = {"$$$", "Affordable", "Bargain", "Beneficiary", ... }

...

public void addSpam(string spamFlag)
{
    spam.Add(spamFlag);
}
使用System.Collections.Generic;
...
私人列表垃圾邮件={“$$”、“价格合理”、“便宜”、“受益人”、…}
...
公共void addSpam(字符串spamFlag)
{
spam.Add(spamFlag);
}
这里您试图写入58个元素零索引数组的索引
58
spam.Length
,在重新调整大小后);也就是说,它从
0
57

你应使用:

Array.Resize(ref spam, spam.Length + 1);
spam[spam.Length - 1] = spamFlag;
也就是说,您应该真正使用
List
。除此之外,它还可以批量调整它使用的内部数组的大小,而不是在每个
Add()
上进行调整,这使得事情更加高效,也更加容易

如果出于某种原因确实需要数组,那么在大部分工作中使用
List
,然后在最后调用
ToArray()

这里您试图写入58个元素零索引数组的索引
58
spam.Length
,在重新调整大小后);也就是说,它从
0
57

你应使用:

Array.Resize(ref spam, spam.Length + 1);
spam[spam.Length - 1] = spamFlag;
也就是说,您应该真正使用
List
。除此之外,它还可以批量调整它使用的内部数组的大小,而不是在每个
Add()
上进行调整,这使得事情更加高效,也更加容易


如果出于某种原因确实需要数组,那么在大部分工作中使用
List
,然后在最后调用
ToArray()

当DLeh提出使用动态增长的列表更好的观点时,Joe的回答提供了一个很好的解释,我想补充一些东西

首先,为了回答您的问题,要修复这两种方法中的任何一种,您可能希望在第一次尝试中使用
spam[spam.Length-1]=spamFlag
,而不是
spam[spam.Length]=spamFlag
。因为索引从0开始,因此边界内的最后一个索引的长度是-1(正如Joe指出的)

如果任何一个数组太短,将引发异常,因此您的第二次尝试将不起作用。看这个。基本上不建议使用Array.Copy,因为您必须确保类型和长度相同

要详细说明
Array.Resize()
,需要注意的是,它实际上是一个用词不当的词,C#实际上并没有调整数组的大小