2015-10-26 103 views
0

我目前在WebAPI上爲對話系統工作(作爲學校項目)。它基本上是兩個用戶之間的郵箱。包含在int數組中

添加新消息時,我想檢查兩個用戶是否已經彼此交談。目前所有內容都是作爲變量存儲在內存中的(這隻適用於學校,以後可以改進)。

我的模式是這樣的:

public class Conversation 
{ 
    public int Id { get; set; } 
    public int[] Users { get; set; } 
    public DateTime Created { get; set; } 
    public DateTime Updated { get; set; } 
    public List<Message> Messages { get; set; } 

    public static List<Conversation> listeConversation = new List<Conversation> 
    { 
     new Conversation { 
      Id = 1, Users = new int[2] {1, 2}, Messages = new List<Message> { 
       new Message { Id = 1, UserId = 1, Content = "Bonjour", Created = DateTime.Now}, 
       new Message { Id = 2, UserId = 2, Content = "Comment ça va ?", Created = DateTime.Now}, 
       new Message { Id = 3, UserId = 1, Content = "Très bien et toi ?", Created = DateTime. 
     } 
    }; 
} 

在我的方法,我收到發送者和接收者ID。我想創建一個新的方法來檢查會話列表是否已包含這兩個用戶之間的一個會話,但我真的不知道該怎麼做。

我想我必須使用Contains,但我真的不知道如何在數組中使用它。我試過這樣的:

private Conversation getConversationFromUsers(int[] users) 
{ 
    Conversation.listeConversation.Where(c => c.Users.Contains(users)); 
} 

但它不工作。

+0

您是否想要在這些用戶或這兩個用戶參與的任何對話之間進行任何對話? –

回答

2

如果我正確理解你的問題,你需要這樣的東西?

Conversation.listeConversation.Where(c => c.Users.Contains(users[0]) && c => c.Users.Contains(users[1]); 

更新:對於兩個以上的比賽使用這樣的:

Conversation.listeConversation.Where(c => c.Users.Intersect(users).Count() > 2) 
+0

它工作,但我想我可以找到一個最簡單的方法來做到這一點,而不使用兩個條件。如果我要搜索更多的用戶,3,4或10,該怎麼辦? – Sakuto

+0

所有數組元素相同但順序不同的情況如何?也許你使用'Where(c => c.Users.All(u => users.Contains(u))&& users.All(u => c.Users.Contains(u)))' – Rik

+0

更新了很多答案案例 – FailedUnitTest

1

嘗試使用LINQ Intersect()方法:

var foundConversations = Conversation.listeConversation.Where(c => c.Users.Intersect(users).Count() >= users.Lenght).ToList(); 

應該與用戶的任何長度的數組工作。

0

我會使用HashSet<int>來存儲您想要查找對話的用戶。這使您可以訪問SetEquals()方法,該方法測試您正在尋找的集合相等性。

private Conversation getConversationFromUsers(int[] users) 
{ 
    var set = new HashSet<int>(users); 
    return Conversation.listeConversation.FirstOrDefault(c => users.SetEquals(c.Users)); 
} 
相關問題