【问题标题】:VB.net sort and retain keysVB.net 排序和保留键
【发布时间】:2011-05-18 01:01:08
【问题描述】:

我有一种情况需要对数组进行排序并保留当前的键值对。

例如这个数组:

(0) = 4
(1) = 3
(2) = 1
(3) = 2

需要这样排序

(2) = 1
(3) = 2
(1) = 3
(0) = 4

保留原始密钥。 Array.Sort(myArray) 排序为正确的序列,但不保留索引。我需要一个变体。

编辑 使用链接,这似乎接近我想要的。我只需要删除多余的括号即可将其转换为 vb.net 吗?

myList.Sort((firstPair,nextPair) =>
    {
        return firstPair.Value.CompareTo(nextPair.Value);
    }
);

(我也可以将它作为一个函数或其他东西集成吗?)

【问题讨论】:

  • 您可以使用字典。这是关于该主题的SO答案。 stackoverflow.com/questions/289/…
  • 这似乎与C#有关。它们兼容吗? (抱歉,vb.net 新手)
  • 是的。它们使用不同的语法,但它们(基本上)是相同的语言。

标签: vb.net arrays


【解决方案1】:

在数组中,顺序由索引(您称之为“键”)确定。因此,不可能有这样的数组:

(2) = 1
(3) = 2
(1) = 3
(0) = 4

您需要的是一个具有顺序(独立于键)的数据结构。您可以为此使用List(Of KeyValuePair) 或(如果您使用.net 4)List(Of Tuple(Of Integer, Integer)); Ken 在评论中提供的链接中显示了一些示例(为方便起见,我将在此重复):


编辑:另一种选择是使用 LINQ 自动创建已排序的IEnumerable(Of Tuple(Of Integer, Integer))

Dim a() As Integer = {4, 3, 1, 2}  ' This is your array

Dim tuples = a.Select(Function(value, key) New Tuple(Of Integer, Integer)(key, value))
Dim sorted = tuples.OrderBy(Function(t) t.Item2)

(未经测试,目前没有可用的 Visual Studio)

【讨论】:

  • 直接复制/粘贴到 Visual Studio 会产生错误,我不知道如何解决
  • @YsoL8:你看懂代码了吗?如果没有,你在哪里迷路了? (如果您不告诉我您遇到了哪些错误,我将无法帮助您解决它们...... ;-))
  • @Heninzi 我得到了预期的语句结束声明数组的内容在第 1 行和第 2 行从 new 关键字开始。我还得到了两个函数关键字预期的表达式。我正在将它粘贴到一个班级的子目录中。
  • @YsoL8:啊,数组初始化语法被破坏了。现在应该修好了。
  • @heninzi 这清除了第 1 行的错误。但是其他的仍然存在。 (我正试图为此解决它们,只是没有成功)。不需要变暗吗?
【解决方案2】:

由于您使用的是 .net 2.0(因为您说您在其中一个 cmets 中使用 Visual Studio 2005),使用 OrderedDictionary 可能是您的一个选项,如果每个数组value 只出现一次。由于 OrderedDictionaries 是按键排序的,因此您可以使用

将数组条目添加到这样的字典中
  • 数组索引作为字典值
  • 数组值作为字典键(将用于对字典进行排序)。

【讨论】:

  • 如果您的意思是没有任何值可以与另一个相同 - 我不能保证(实际上很有可能)。快速获得感觉net 2.0已经过时了,升级是我无法控制的。最新版本是什么?
  • @YsoL8:最新版本是 4.0 (Visual Studio 2010)。 Visual Studio 2008 支持 3.5。
【解决方案3】:

您正在寻找的是将其存储为字典 并按值按字典排序。

我认为字典的 VB .Net 语法是 Dictionary(of Int, Int)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
相关资源
最近更新 更多