【问题标题】:How to renumber an ObservableCollection<KeyValuePair<int, string>如何重新编号 ObservableCollection<KeyValuePair<int, string>
【发布时间】:2014-12-04 12:20:44
【问题描述】:

我正在将带有 Key/Value -> int(索引)和字符串的 ObservableCollection 绑定到 ItemsControl 中的文本框。

<TextBox Text="{Binding Path=Value , Mode=OneWay}" />

如果单击 ItemsControl 中的按钮,则可以删除 Collection 中的项目。

private ObservableCollection<KeyValuePair<int, String>> testlist;

public ObservableCollection<KeyValuePair<int, String>> TestList
{
    get { return testlist;  }
    set {
        testlist = value;
        NotifyPropertyChanged("TestList");
    }
}

public void DeleteItem(int index)
{
    TestList.RemoveAt(index);
}

现在我想重新编号集合的索引(int),例如:

  • 删除项目前的集合:0 - “aaa”、1 - “bbb”、2 - “ccc”、3 - “ddd”
  • 删除项目后的集合:0 - “aaa”,2 - “ccc”,3 - “ddd”
  • 重新编号后的集合:0 - “aaa”,1 - “ccc”,2 - “ddd”

我该怎么做?

【问题讨论】:

  • 您希望商品保留之前的订单吗?
  • 你确定你需要一个 KeyValuePair,看起来像一个简单的枚举就可以了......

标签: c# .net observablecollection key-value


【解决方案1】:

删除项目后投射一个新的ObservableCollection

Testlist.RemoveAt(1);
Testlist = new ObservableCollection<KeyValuePair<int, string>>(Testlist
    .OrderBy(kvp => kvp.Key)
    .Select((kvp, seq) => new KeyValuePair<int, String>(seq, kvp.Value)));

注意事项

  • OrderBy 保留了排序
  • 使用提供项目索引的Select 重载。假定从零开始编号。

【讨论】:

  • 这个顺序不应该是键而不是值吗?尽管 OP 的示例可以以任何方式工作。
  • 感谢您的回答。有用。最后一个问题。如果我有键/值的集合:0/a、2/c、1/b,我如何在不更改值的情况下对它们进行排序:0/a、1/c、2/b?
  • @StuartLC 我的新问题与旧问题无关。我只想更改 ObservableCollection 中的所有键而不更改值。是的,0/a、1/c、2/b 是理想的结果。
  • 您似乎只想保持原来的“自然”秩序?那么它与原始答案相同,只是没有OrderBy 步骤?我错过了什么?
【解决方案2】:

你可以通过foreach来做,但在此之前你需要对它们进行排序,因为键是只读的,你应该建立一个新的集合

// Acquire keys and sort them.
var list = ObservableCollection.Keys.ToList();
list.Sort();

int i = 0;
var newList = new ObservableCollection<KeyValuePair<int, string>>();
foreach (var key in list)
{
     newList.Add(new KeyValuePair<int, string>(i, ObservableCollection[key].Value));
     i++;
}

但是,您可以将项目从删除项目的编号移开

【讨论】:

  • KeyValuePair&lt;K,V&gt;.Key 是只读的。所以你必须创建新的KeyValuePair&lt;int, string&gt; 才能完成这项工作。
  • 谢谢,如果没有建议修复,我似乎应该删除我的答案
  • 你应该这样做 newList.Add(new KeyValuePair&lt;int, string&gt;(i, ObservableCollection[key].Value)); 问题是你的 newList 是空的,你会在尝试将某些东西设置为特定索引时遇到异常。
  • @juharr 谢谢,看来我把这个问题弄错了一个普通的收藏;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 2011-03-05
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
相关资源
最近更新 更多