2012-01-13 12 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 
} 

問題は、データを配列に追加する方法がわかりません。他の既存の配列データを新しい配列に新しい値でコピーする方法はわかりません。これはできますか?

2次元配列でarray.Contains()が機能しないため、ユーザー名と時間を記録するにはどうすればよいですか?データを2つの配列に挿入する必要がありますか?

ありがとうございました。

+1

配列は一般的に静的なサイズを有しています。なぜIEnumerableの他の実装(Listなど)の代わりにこれを使用していますか? –

答えて

2

C#の配列は固定サイズの構造体です。

このリストを先入れ先出しキューとして実装できる「リスト」か、ランダムに削除して挿入する場合は「辞書」が必要です。

これらの構造は両方とも動的にストレージを割り当て、ユーザーの数を拡大したり縮小したりすることができます。

+0

お受け取りいただきありがとうございます。私は "リー・サイ・エン"のコードサンプルで完全な答えが良いと感じますが! –

2

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); 
}  
関連する問題