2012-01-13 80 views
0

我正在为我的IRC中的用户保留一个计时器。当用户输入消息时,我试图插入消息的用户名&时间。这是为了阻止垃圾邮件发送者。满足条件时将数据追加到数组中?

if(userList.Contains(username)) { 
//check the time of message 
//if last message is 3 seconds ago or greater, continue 
} else { 
//Add username & time into the array keeping all other values too 
} 

问题是我不知道如何将数据追加到数组中。我不知道如何使用新值将其他现有阵列数据复制到新阵列中。这可以做到吗?

由于array.Contains()不适用于二维数组,因此我可以如何记录用户名和时间?我应该在两个数组中插入数据吗?

谢谢你的帮助。

+1

阵列通常有一个静态的大小。为什么使用它而不是IEnumerable的其他实现之一(如List)? – 2012-01-13 01:36:09

回答

2

C#中的数组是固定大小的结构。

你想要一个“列表”,这将允许你实现这个先入先出队列,或者,如果你想删除并随机插入一个“字典”。

这两种结构都将动态分配存储空间,并允许您扩展和缩减用户数量。

+0

感谢您的接受。虽然我觉得“Lee Sy En”的答案完整,代码示例更好! – 2012-01-16 03:20:48

2

您应该创建List<T>Dictionary<K,V>而不是双暗阵列。首先定义一个具有UserName,TimeOfMessage和Message等字段/属性的类(例如Message),并创建List<Message>.

2

使用Dictionary<TKey, TValue>

代码示例,这是粗略的想法,你可以从这里修改:

private static void Main(string[] args) 
{    
    var list = new Dictionary<string, DateTime>(); 
    list.Add("John", DateTime.Now.AddSeconds(-1)); 
    list.Add("Mark", DateTime.Now.AddSeconds(-5)); 
    list.Add("Andy", DateTime.Now.AddSeconds(-5)); 

    PrintList(ref list); 

    IsSpam(ref list, "John"); 
    PrintList(ref list); 
    IsSpam(ref list, "Andy"); 
    PrintList(ref list); 
    IsSpam(ref list, "Andy"); 
    PrintList(ref list); 
} 

private static void IsSpam(ref Dictionary<string, DateTime> list, string username) 
{ 
    if (list.ContainsKey(username)) 
    { 
     if (list[username] < DateTime.Now.AddSeconds(-3)) 
      Console.WriteLine("Not a spam"); 
     else 
      Console.WriteLine("Spam"); 

     list[username] = DateTime.Now; 
    } 
    else 
    { 
     list.Add(username, DateTime.Now); 
    } 
} 

private static void PrintList(ref Dictionary<string, DateTime> list) 
{ 
    foreach (var c in list) 
     Console.WriteLine("user: {0}, time: {1}", c.Key, c.Value); 
}