2015-06-26 3 views
0

Я работал над проектом онлайн-форума, и я хочу добавить комментарий к статье.Определить структуру KeyValuePair как <int, List <string>>

В моем воображении мне может понадобиться создать некоторую структуру, такую ​​как KeyValuePair <int,List<string>>. Каждая статья имеет свой собственный номер titleNum, который используется для записи номера статьи.

В моей программе, она должна быть как

public void addcomment(int titleNum, string comment) 
{ 
    int title = 
    using Data = System.Collections.Generic.KeyValuePair<int, List<string>> 
    List<string> a = new List<string>; 
    a.add(comment) 
    //then append List a to Data 
} 

public List<string> getComment (int inputTitleNum) 
{ 
//return string List which titleNum = inputTitleNum 
} 

Однако, я не знаю, что теперь делать. В конечном итоге это должно быть так. Когда я ввожу inputTitleNum в функцию getComment, он должен вернуть commentList.

+0

Как вы справляетесь сами сообщения? У вас нет какой-то базы данных для хранения вещей? – nvoigt

+0

Для добавления комментариев вам нужен StringBuilder, а не список , это облегчит достижение цели. –

+2

Coda Chang, side q: На каком языке вы пытаетесь заставить C#? Это, безусловно, не JavaScript, поскольку у него хорошие объекты - PHP? Стиль, который вы используете, на самом деле не является родным для C#, который предпочитает описательные сильно типизированные объекты, такие как 'class Comment {Text, Author, LinkToArticle ...}' над массивами массивов и кортежей кортежей ... –

ответ

2

О вашем методе, вы должны использовать базу данных, если у вас есть много комментариев s или вы хотите создать ассоциации. И т.д. связать с датой, пользователем. Это будет быстрее для поиска и т. Д. Рассмотрим поиск SQLite, который представляет собой базу данных, хранящуюся в виде текстового файла.

Если вы просто удовлетворены с помощью списка, хотя, это должно работать:

public class Article 
{ 
    public Dictionary<int, List<string>> articleComments = new Dictionary<int, List<string>>(); 

    public void AddComment(int titleNum, string comment) 
    { 
     if (!articleComments.ContainsKey(titleNum)) 
     { 
      articleComments.Add(titleNum, new List<string>()); 
     } 
     articleComments[titleNum].Add(comment); 
    } 

    public List<string> GetComment(int titleNum) 
    { 
     if (articleComments.ContainsKey(titleNum) 
     { 
      return articleComments[titleNum]; 
     } 
     return null; 
    } 
} 
+0

О, я просто хочу сначала создать простой прототип. Я попытаюсь использовать его код в своей программе, это прекрасно !. –

+1

Я понял, спасибо. Btw I изменить 'Словарь >' в словарь > –

+0

@CodaChang О да, спасибо за уловку ха-ха! – Cardin

0

Во-первых, то, что вы написали, недействительно C#. Это должно быть что-то вроде:
private KeyValuePair<int, List<string>> Data {get; set; }

тогда ваша функция AddComment будет выглядеть следующим образом:

public void addComment(int titleNum, string comment) { 
    if (!this.Data.ContainsKey(titleNum) { 
     this.Data.Add(titleNum, new List<string>()); 
    } 
    this.Data[titleNum].Add(comment); 
} 

и getComment:

public List<string> getComment(int titleNum) { 
    return this.Data[titleNum]; 
} 

В соответствии с контрактом KeyValuePair, вы бы получить его с помощью

3

Если я правильно понимаю ваш вопрос для этой цели вы можете использовать Dictionary<int, List<string>>

Dictionary<int, List<string>> articles = new Dictionary<int, List<string>>(); 

    public void AddComment(int titleNum, string comment) 
    { 
     if(!articles.Keys.Contains(titleNum)) articles.Add(titleNum, new List<string>()); 
     articles[titleNum].Add(comment); 
    } 

    public List<string> getComment (int titleNum) 
    { 
     return articles[titleNum]; 
    } 

Но вы должны действительно рассмотрим использование Entity Framework, базы данных SQL и репозитория. После этого вы можете использовать модели комментариев и статей для работы с данными из своей базы данных. Вы даже можете создавать и использовать viewmodels, например CommentList, для отображения ваших данных.

Допустим, у вас есть комментарий объект в базе данных, как это:

public class Comment 
{ 
    public long Id { get; set; } 
    public string Title{ get; set; } 
    public string Text { get; set; } 
    public long ArticleId { get; set; } 
} 

И сущность статьи что-то вроде этого:

public class Article 
{ 
    public long Id{ get; set; } 
    public string Header { get; set; } 
    public string Text { get; set; }   
    public long AuthorId { get; set; } 
} 

Теперь вы можете добавить методы в репозиторий класса, которые работают с этим модели:

public class Repository : IRepository 
{ 
    .... 
    private MyDbContext _cont; 

    public Comment getComment (int Id) 
    { 
     return _cont.Comments.FirstOrDefault(c => c.Id == Id); 
    } 

    public List<Comments> GetCommentsList(int articleId) 
    { 
     return _cont.Comments.Where(c => c.ArticleId == aricleId).ToList(); 
    } 
} 

И в вашем контроллере используйте его следующим образом:

public ActionResult GetComments(long Id) 
    { 
     object model = List<Comment> comments = Repo.GetCommentsList(Id); 
     return View(model); 
    } 
+0

Эта работа тоже. Я буду изменять свою программу, используя базу данных. Вы очень помогли –

+0

Просто обновили, проверьте, пожалуйста ... Вы приветствуете – Fabjan

0

Использование словаря для этого не будет лучшим подходом, особенно если вы решите использовать базу данных. Вы должны хранить список комментариев внутри своего класса Article.

public class Article 
{ 
    public int ArticleNum { get; set; } 
    public string Creator { get; set; } 
    public DateTime DateCreated { get; set; } 
    public List<string> Comments { get; set; } 
public Article() 
    { 
     this.Comments = new List<string>(); 
    } 

    public void AddComment(string comment) 
    { 
     this.Comments.Add(comment); 
    } 

    public void RemoveComment(string comment) 
    { 
     this.Comments.Remove(comment); 
    } 
} 

Вы также могли бы избавиться от списка строк для комментариев и создать комментарий класса и иметь перечень комментариев вместо этого.

общественного класса Статья { общественного ИНТ ArticleNum {получить; задавать; } public string Creator {get; задавать; } public DateTime DateCreated {get; задавать; } Публичный список Комментарии {get; задавать; }

public Article() 
    { 
     this.Comments = new List<Comment>(); 
    } 

    public void AddComment(Comment comment) 
    { 

     this.Comments.Add(comment); 
    } 

    public void RemoveComment(Comment comment) 
    { 
     this.Comments.Remove(comment); 
    } 
} 
public class Comment 
{ 
    public string Comment { get; set; } 
    public string Creator { get; set; } 
    public DateTime DateCreated { get; set; } 
}