【问题标题】:Contains on array of int包含在 int 数组上
【发布时间】:2015-10-26 19:54:35
【问题描述】:

我目前正在(作为学校项目)开发用于会话系统的 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));
}

但它不起作用。

【问题讨论】:

  • 您想要仅在这些用户之间进行任何对话,还是需要这两个用户参与的任何对话?

标签: c# linq contains


【解决方案1】:

如果我正确理解了你的问题,你需要这样的东西吗?

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)

【讨论】:

  • 它工作,但我想我可以找到一个最简单的方法来做到这一点,而无需使用两个条件。如果我要搜索更多用户(3、4 或 10 个)怎么办?
  • 所有数组元素相同但顺序不同的情况怎么办?也许你使用 'Where(c => c.Users.All(u => users.Contains(u)) && users.All(u => c.Users.Contains(u)))'
  • 谢谢,刚刚把“2”改成了“users.Count()”,谢谢!
【解决方案2】:

尝试使用LINQ Intersect() 方法:

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

它应该适用于任何长度的用户数组。

【讨论】:

    【解决方案3】:

    我会使用HashSet&lt;int&gt; 来存储您要查找其对话的用户。这使您可以访问 SetEquals() 方法,该方法测试您正在寻找的集合相等性。

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

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 2012-08-14
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 2013-10-17
      • 2021-12-15
      相关资源
      最近更新 更多