我目前正在WebAPI上为会话系统工作(作为学校项目)。它基本上是两个用户之间的邮箱。
添加新邮件时,我想检查两个用户是否已经互相交谈过。目前所有内容都作为变量存储在内存中(它仅适用于学校,以后可以进行改进)。
我的模型是这样的:
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)
答案 1 :(得分:1)
尝试使用LINQ Intersect()
方法:
var foundConversations = Conversation.listeConversation.Where(c => c.Users.Intersect(users).Count() >= users.Lenght).ToList();
它适用于任何长度的用户数组。
答案 2 :(得分:0)
我会使用HashSet<int>
来存储您想要查找其会话的用户。这使您可以访问SetEquals()
方法,该方法测试您正在寻找的集合相等性。
private Conversation getConversationFromUsers(int[] users)
{
var set = new HashSet<int>(users);
return Conversation.listeConversation.FirstOrDefault(c => users.SetEquals(c.Users));
}