【问题标题】:KeyValue Pair C#键值对 C#
【发布时间】:2019-12-03 21:55:49
【问题描述】:

我试图弄清楚如何在 C# 中使用 KeyValuePairs 列表。我会使用字典,但它们不允许重复值。

还有查找,我也无法弄清楚如何编写语法。

我见过其他解决方案,但我真的很困惑如何使用

当然,我能找到的唯一例子是 for 循环,我想让它更简洁一些。

List<KeyValuePair<char, int>> data = new List<KeyValuePair<char, int>>();

例如,我想在添加元素之前进行一些检查。 例如:我有一个字符数组,我想在将其添加到我的列表之前对其进行检查。谁能告诉我如何检查。

char[] inputArray = input.ToCharArray();
for(int i = 0; i < inputArray.Length ; i++)
{
    if(!data.Values.Contains(inputArray[i]))
    {
        data.Add(new KeyValuePair<char,int>(inputArray[i], 1));
    }
}

上面的代码不起作用。有人可以帮助一下语法。

我没有在网上找到任何具体的例子。 任何帮助表示赞赏。

【问题讨论】:

  • 我不知道你想做什么。字典的全部意义在于存储唯一的键......所以不,它不允许重复,如果这样做会非常糟糕。
  • 好的,所以你说你不想要重复的键,但是你的循环看起来是在检查重复的条目而不是添加它们,所以我不确定你为什么不能使用字典?您还根据键检查数组,但将 1 添加到以数组为键的值中,这也没有多大意义......
  • 您的问题是“数据”是一个列表,没有“值”方法。请注意 Cocowalla 在他的回答中的语法。 Any() 方法有效地循环遍历您的 kvp 列表并比较每个键。此外,如果您的逻辑试图防止重复键,您应该只使用字典,它更容易使用。

标签: c# linq keyvaluepair


【解决方案1】:

我不得不说,你的问题相当混乱。我认为您正在尝试将值添加到KeyValuePair 的列表中,如果该键尚不存在?这似乎与你所说的不使用 Dictionary 不符,但无论如何你都可以:

List<KeyValuePair<char, int>> data = new List<KeyValuePair<char, int>>();

char[] inputArray = "my string".ToCharArray();
foreach (var t in inputArray)
{
    if (!data.Any(x => x.Key == t))
    {
        data.Add(new KeyValuePair<char, int>(t, 1));
    }
}

如果您只想从 inputArray 中获取唯一值,您也可以这样做:

var myVals = inputArray.Distinct();

最后,如果您想获取字符串中每个不同字符的计数,您可以使用:

var counts = inputArray.GroupBy(x => x)
    .Select(group => new
    {
        Character = group.Key,
        Count = group.Count()
    });

【讨论】:

  • 感谢您的回答正是我想要的。我希望有一个更简洁的语法并避免额外的 for 循环。你说的很对,谢谢你的回答。
  • @panoskarajohn 如果您从不输入重复值,为什么不使用字典?
  • 我看到了字典的限制并想问,如果我想这样做,我不会问这个问题。似乎每个人都很不高兴我问。很抱歉浪费了您的时间。
  • @panoskarajohn 没有人不高兴,我们都在这里提供帮助。根据您的要求,字典似乎更合适。 XY Problems 在这里非常常见,我们提出这些问题是为了尝试和帮助。您的问题表明“字典不能包含重复值”,这是错误的,它们不能包含重复的“键”。由于此答案和您的代码逻辑 never 允许添加重复键,因此它看起来像字典是显而易见的解决方案
  • @panoskarajohn 如果您反对使用 Linq,我真的认为 Dictionary 是您想要使用的。 Dictionary 具有比遍历整个集合更快的重复检查功能。
【解决方案2】:

根据你的 cmets,真的听起来你想要一个字典。

考虑您的逻辑,您在添加到列表之前已经检查了重复项,对吧?这意味着您的列表将永远重复。字典可防止您拥有重复的键,而不是重复的值。所以你的逻辑很容易变成:

var dictionary = new Dictionary<char, int>();
foreach(char c in input)
{
    //faster than Any()
    if(!dictionary.ContainsKey(c))
    {
        dictionary.Add(c, 1);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2013-03-15
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多