- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个类(class),MyClass
实现 INotifyPropertyChanged
并具有一些实现 PropertyChanged
的属性.当MyClass.MyProperty
变化,PropertyChanged
按预期开火。另一个类包含一个 SortedList<MyClass>
.我尝试将事件合并到包含 SortedSet<MyClass>
的类中的单个可观察对象中并订阅它,但它似乎没有任何事件。这是我正在尝试的:
Observable.Merge(MySortedList.ToObservable())
.Subscribe(evt => Console.WriteLine("{0} changed", evt.MyProperty));
我想要得到的是一个单独的可观察对象,它包含我的 SortedList<MyClass>
中每个项目的所有事件。 .我试过使用 ObservableCollection 代替,但这不会改变任何东西,也不会期望它真的改变,因为无论如何,当包含的项目的属性发生变化时它不会触发 collectionchanged。我可以听到 SortedList<MyClass>
中的单个元素并看到 PropertyChanged 事件触发,但我想要的是单个 Observable,它包含来自 SortedList<MyClass>
中所有元素的所有 PropertyChanged 事件流。 .
看起来这应该是使用 Rx 很容易做到的事情,但我似乎无法弄清楚如何去做。
最佳答案
我已经为 RxCookBook 写了一篇关于这个主题的文章,你可以在这里找到 https://github.com/LeeCampbell/RxCookbook/blob/master/Model/CollectionChange.md更多关于 PropertyChange 通知的文章在这里 https://github.com/LeeCampbell/RxCookbook/blob/master/Model/PropertyChange.md
它通过汇总来自 ObservableCollection<T>
的更改来解决您的需求.通过使用 ObservableCollection<T>
当集合中添加或删除项目时,您还会收到通知。
如果您不想使用 ObservableCollection<T>
(即您只想跟踪集合的给定快照的属性)那么您将需要做其他事情。首先我假设你有一个 INoftifyPropertyChanged
至 IObservable<T>
扩展方法,或者您将使用标准事件来 IObservable<T>
方法。
接下来,您可以将值列表投影到更改序列列表中,即 IEnumerable<T>
至 IEumerable<IObserable<T>>
.这允许您使用 Observable.Merge
将更改列表展平为单个更改流。
如果您不想使用上面的链接,这里有一个示例:
void Main()
{
var myList = new List<MyThing>{
new MyThing{Name="Lee", Age=31},
new MyThing{Name="Dave", Age=37},
new MyThing{Name="Erik", Age=44},
new MyThing{Name="Bart", Age=24},
new MyThing{Name="James", Age=32},
};
var subscription = Observable.Merge(myList.Select(t=>t.OnAnyPropertyChanges()))
.Subscribe(x=>Console.WriteLine("{0} is {1}", x.Name, x.Age));
myList[0].Age = 33;
myList[3].Name = "Bob";
subscription.Dispose();
}
// Define other methods and classes here
public class MyThing : INotifyPropertyChanged
{
private string _name;
private int _age;
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged("Name");
}
}
public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged("Age");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public static class NotificationExtensions
{
/// <summary>
/// Returns an observable sequence of the source any time the <c>PropertyChanged</c> event is raised.
/// </summary>
/// <typeparam name="T">The type of the source object. Type must implement <seealso cref="INotifyPropertyChanged"/>.</typeparam>
/// <param name="source">The object to observe property changes on.</param>
/// <returns>Returns an observable sequence of the value of the source when ever the <c>PropertyChanged</c> event is raised.</returns>
public static IObservable<T> OnAnyPropertyChanges<T>(this T source)
where T : INotifyPropertyChanged
{
return Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
handler => handler.Invoke,
h => source.PropertyChanged += h,
h => source.PropertyChanged -= h)
.Select(_=>source);
}
}
输出:
Lee is 33
Bob is 24
关于c# - 从 SortedList<MyClass> 中 T.MyProperty 上的所有 Property Changed 事件中获取 IObservable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18750718/
由于我使用的现有框架,方法调用返回一个 SortedList 对象。因为我写了这个调用的另一端,所以我知道它实际上是一个 SortedList。虽然我可以继续使用 SortedList,但使用泛型会更
我在 RecyclerView 中遇到 Android SortedList 的问题,主要是 remove 方法: public void replaceAll(List userFertList,
我想比较在 SortedList 中用作键的字节数组 public SortedList myList = new SortedList(); 问题是,我无法将条目添加到 myList 中,因为 .N
我想总结 SortedList 的某些值(时间范围从开始到结束)与林克。键包含工作日的日期,值包含给定日期可能的工作时间。我想回答的问题是,在给定的时间范围内有多少小时是可能的。 我设法计算了 key
可以SortedList取两个键并返回一个值? 我有 SortedList 类型的标准 但现在我需要传递两个键来找到值 SortedList . 这可能吗?如果没有,请告诉我其他一些解决方案,我构建了
我有降序排列的 SortedList。 public class MyComparer : IComparer { public int Compare(int x, int
我正在尝试将 SortedList 与不区分大小写的字符串比较结合使用。以下是工作: SortedList mySL = new SortedList(new CaseInsensitiveCompa
我正在开发一种算法,该算法在很大程度上依赖于某些列表中元素的顺序,但是,该列表需要允许重复和随机访问其元素(不使用迭代器)。我在java中搜索过这样的东西,但找到的选项总是缺少我提到的条件之一。 任何
其中一位使用我编写的协议(protocol)生成工具的人报告了一个我无法真正理解的错误: Failed to compare two elements in the array. 我使用 Sorted
看起来 SortedList 已被排除。您认为现有集合中最合适的是什么? (保持同样快速的访问和更改) silverlight字典可以永久排序吗? 最诚挚的问候VLK 最佳答案 我将 Wintelle
我最初有一些代码,简化后看起来像这样: var planets = new List { new Planet {Id = 1, Name = "Mercury"}, new Plan
不使用扩展方法 (LINQ)。不幸的是,我仅限于 .NET 2.0。 (是的,这很糟糕) 寻找接近 O(log(n)) 的东西。 感谢您的帮助。 最佳答案 要查找大于给定键的第一个键,您可以使用键列表
我的问题是枚举器从 SortedList 中删除项目是否安全? SortedList myDictionary; // omitted code IEnumerator enum = myDictio
我正在向排序列表中添加一些独特的法语单词,但它似乎无法区分某些单词,例如“bœuf”和 boeuf。 private static void TestSortedList() { Thread
有没有办法将 android.support.v7.util.SortedList 转换为 java.util.List? (或任何其他子类)我看到的唯一方法是遍历 SortedList 并将元素一个
我有这个对象: class Animation { //[...] private SortedList frames = new SortedList();
我在理解 RecyclerView 的 SortedList 时遇到一些问题。 假设我有一个非常简单的类,只有一个非常简单的类保存数据: public class Pojo { public
下面的代码遍历一个列表并获取值,但是我如何编写一个类似的语句来获取键和值 foreach (string value in list.Values) { Console.WriteLine(v
任何人都可以解释为什么这段代码: Dim Data As New SortedList(StringComparer.InvariantCultureIgnoreCase) Data.Add("AB"
有一个SortedList slLanguage = new SortedList(); slLanguage.Add("Bahasa","id-ID"); slLanguage.Add("Chine
我是一名优秀的程序员,十分优秀!