【问题标题】:Find all occurences of a value in a list查找列表中所有出现的值
【发布时间】:2021-12-29 00:54:44
【问题描述】:

我正在尝试获取 player.userID 在列表中显示的次数,但我似乎无法弄清楚如何,我已经在互联网上搜索了一个小时。

        class ConfigData
        {

            [JsonProperty(PropertyName = "Ban")]
            public uint ban = 3;
            [JsonProperty(PropertyName = "Kick")]
            public uint kick = 2;
            [JsonProperty(PropertyName = "Banned Message")]
            public string kickMessage = "You are banned";

        }

        class StoredData
        {
            public List<ulong> Reports = new List<ulong>();
            public List<ulong> Banned = new List<ulong>();
            public List<ulong> Kicked = new List<ulong>();

        }
        void OnPlayerConnected(BasePlayer player)
        {
            int count = storedData.Reports.Count(reportedID => reportedID == player.userID);
            Puts($"{player.userID} has {count} reports");
            if (count >= configData.ban)
            {
                storedData.Banned.Add(player.userID);
                SaveData();
                return;
            }
            if (storedData.Banned.Contains(player.userID))
            {
                Network.Net.sv.Kick(player.net.connection, rust.QuoteSafe(configData.kickMessage));
                return;
            }
            else
            {
                return;
            }
        }

如果需要,我可以发布完整的代码。

【问题讨论】:

  • 你不是说&gt;= configData.ban吗?
  • storedData.Reports 是什么列表?这些项目是否具有UserId 属性?
  • 不,如果它的 == 到那个,那么它会禁止玩家,但计数会这样说。 i.imgur.com/UrvJLCQ.png
  • @TheReality 欢迎来到 Stack Overflow。请通过tour 了解 Stack Overflow 的工作原理,并阅读How to Ask 以了解如何提高问题的质量。然后edit你的问题将你的源代码包含为一个工作minimal reproducible example,它可以被其他人编译和测试。
  • 数据是一个ulong列表

标签: c# find-occurrences


【解决方案1】:

Count 方法接受一个 lambda,告诉它计数的条件。

由于您的报告只是用户 ID 的列表,您只需:

int count = storedData.Reports.Count(reportedID => reportedID == player.userID); 
if (count >= configData.ban)   // NOTE: changed this to >=
{
  ...
}

附带说明一下,如果它是一个对象列表,并且您想与名为 someProperty 的属性进行比较,那么它将是:
report =&gt; report.someProperty == player.userID。

lambda 只是函数的简写; =&gt; 之前的部分是参数列表(这里,它只接受一个参数 - storedData.Reports 的当前元素)。参数名称是任意的(您的选择)。

=&gt;后面的部分是函数体,隐式返回,所以
reportedID == player.userID就像
{ return reportedID == player.userID; }。

Count 方法基本上遍历Reports 中的 ID,并且对于每个 ID,它都会询问 lambda 是否应该计算它,方法是将 ID 传递给 lambda,并检查 lambda 是否返回 @ 987654332@或false。

附: 在你的代码中它说:

if (!storedData.Banned.Contains(player.userID)) { /* kick */ }

您确定要踢出 禁止列表中的玩家吗?检查与踢/禁止相关的逻辑(也许做一些测试),这对我来说看起来不太正确。

【讨论】:

  • OP 说类似 Reports is List&lt;ulong&gt;,所以我认为我们还没有足够的信息来解决这个问题。
  • @Charles 不,我认为 ulong 是用户 ID,错误消息是 Count 需要一个 lambda,但得到了一个 ulong。此外,我已经提供了足够的信息让 OP 能够自己解决问题,即使我没有完全正确。
  • 我认为这不是唯一的问题,将报告存储在 Dictionary 中可能会更好
  • 我如何发布完整代码?
  • 我更新了,现在看起来应该可以理解了
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 2011-09-11
  • 2012-11-08
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多