我需要比较两个xml文档.
假设以下每个XElement的负载来自Stream:
XElement actualElement = XElement.Load(actual);
XElement expectedElement = XElement.Load(expected);
Run Code Online (Sandbox Code Playgroud)
使用它,以下哪两个更好:
XNodeEqualityComparer comparer = new XNodeEqualityComparer();
comparer.Equals(actualElement, expectedElement);
Run Code Online (Sandbox Code Playgroud)
要么
XElement.DeepEquals(actualElement, expectedElement);
Run Code Online (Sandbox Code Playgroud)
我知道第二个选项更短,但我更感兴趣的是你在使用其中一个时是否获得任何速度提升或更好/更深的比较.比较本身需要比较两个xml文档之间的元素,属性和所有值.
我正在开发一个大型Silverlight应用程序,它使用双工Net.TCP与WCF后端通信.我正在将这个应用程序从MVC方法转移到MVVM.但是,我正在努力使用正确的方法来实现我的ViewModel.我们正在为我们的模型使用WCF生成的代理,这个代理非常复杂,涉及许多类,大量集合以及各种多对多关系.例如,用户可以属于许多房间,房间可以有许多用户,用户可以有许多SharedFiles,并且每个SharedFile可以与用户当前所属的任何房间共享.诸如此类的事情.
最重要的是,由于我们在双工模式下使用WCF,因此可以由最终用户或后端的WCF服务触发对模型的更改.换句话说,我们使用的模型比您在各种MVVM书籍/文章/博客文章中看到的典型"模型"复杂几个数量级.这就是问题所在,因为保持我们的ViewModel层与底层模型层同步变得有点麻烦.
这是一个典型的问题.新的"用户"加入"房间",因此WCF服务向房间中的所有其他用户发出"SessionAdded"通知.SessionAdded通知带有一个Session对象,该对象具有链接的Room和链接的User对象.从WCF服务反序列化的Room对象与本地客户端上的Room对象基本相同,并且可能具有大部分相同的数据,但它肯定没有所有相同的数据,并且至少有一些数据(就像它的null Whiteboards集合)肯定是错误的.所以我们需要以某种方式获取这些传入的数据并将其合并到我们现有的模型中.然后我们需要在每个新对象的基础上创建ViewModel,和/或用新对象和/或它们的数据更新现有的ViewModel.
现在我们通过让各种ViewModel响应相关的WCF通知事件来处理这个问题,并尽力修复它们的底层模型和相关的视图模型.我们已经找到了一些技巧,比如一个SynchronizedObservableCollection(模糊地像这里的那个),它监视(说)Room.Sessions ObservableCollection并自动创建相应的SessionViewModels并将它们放在RoomViewModel.SessionViewModels集合中.我们还使用ViewModelFactory来缓存视图模型,并确保包装给定Session的SessionViewModel保持不变,即使底层Session对象被更改了.(如果重要的话,我们使用的是viewmodel-first方法,因为我们需要的很大一部分是为了响应由我们的WCF通知触发的ViewModel中的更改而创建新的UI元素.)
所有这一切都有效.基本上.大多数时候.你懂.但是要维护的代码很多,而且很容易出错.单元测试很方便,只要你能记住应该发生的事情,但是当你完成处理你的第20次级联CollectionChanged事件时,很难跟踪所有这些如何组合在一起以及你首先测试的是什么.换句话说,这一切都非常脆弱.
在我看来,这是许多人必须遇到的那种场景,我很好奇其他人是如何面对它的.我可以想到一些方法可能会让它变得更好:
(1)将客户端模型视为一种需要保持完全一致的数据库,并实现客户端数据访问层,其作用是保持模型的一致性.无论是来自用户还是服务器,对模型的所有更新都需要通过该层.它有点像实体框架,因为它myRoom.Users.Add(myUser)会自动设置myUser.Room = myRoom,反之亦然,等等.(这尤其是某个地方应该已经开发出来的部分,尽管我还没有找到它.)
(2)倾向于使用Truss或Obtics这样的东西来保持所有部分的同步.不太确定它是如何工作的,但它在理论上听起来应该是可能的.
还有什么?我很好奇用于解决这个问题的模式或框架.
我的单页javascript应用程序通过REST调用以JSON格式检索数据.使用标准ISO8601格式的UTC时区格式化日期,例如2011-02-04T19:31:09Z.
注册该服务时,用户从下拉列表中选择他们的时区.此时区可能与用户浏览器的时区不同.javascript应用程序始终知道用户选择的时区是什么.
我知道如何将UTC字符串转换为日期.我知道Javascript只代表当地时区的日期.
但是我遇到了麻烦,想知道如何显示为时区而不是用户的本地时区格式化的日期.它必须在所有日期考虑DST.在内部,我希望将所有日期作为UTC处理,并且仅在显示时转换为另一时区中日期的字符串表示.我需要在用户个人资料中选择的时区中显示日期,而不是浏览器的时区.
我已经尝试过服务器发送用户浏览器时区和用户配置文件时区之间的时区偏移差异(以毫秒为单位).但我发现我不能只发送一个偏移值,但需要为每个日期发送一个偏移量来解释夏令时的变化.
有关如何显示各种时区格式的日期的任何建议或示例代码?到目前为止我找到的选项:
有没有更简单或更好的解决方案?
我想从HTML页面中提取所有表行.但是使用这种模式@"<tr>([\w\W]*)</tr>"是行不通的.它给出了一个结果,它是<tr>最后一次出现的结果</tr>.但我想要每一次出现<tr>...</tr>价值.谁能告诉我怎么做到这一点?
我必须调用一个带Class参数的方法:
public action(Class<? extends SomeInterface> classVariable);
Run Code Online (Sandbox Code Playgroud)
我能够做到这一点:
action(new SomeInterface() {
// implement interface
}.getClass());
Run Code Online (Sandbox Code Playgroud)
但是,如果没有实例化对象并调用它,我可以逃脱getClass()吗?
错误:
Traceback (most recent call last):
File "C:\Python26\Lib\idlelib\full_rpg.py", line 145, in <module>
Commands[c](p)
File "C:\Python26\Lib\idlelib\full_rpg.py", line 57, in status
print "%s's Level:" % (self.name, self.level)
TypeError: not all arguments converted during string formatting
Run Code Online (Sandbox Code Playgroud)
导致错误的代码行:
print "%s's Level:" % (self.name, self.level)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我ListView正在使用扩展名BaseAdapter,我无法正确刷新它.当我刷新时,似乎旧数据在新数据之上绘制,直到滚动事件发生.旧行绘制在新行的顶部,但是当我开始滚动时,旧行会消失.
我已经打过电话invalidateViews(),notifyDataSetChanged()和notifyDataSetInvalidated().我的代码看起来像:
private void updateData()
{
List<DataItems> newList = getNewList();
MyAdapter adapter = new MyAdapter(getContext());
//my adapter holds an internal list of DataItems
adapter.setList(newList);
mList.setAdapter(adapter);
adapter.notifyDataSetChanged();
mList.invalidateViews();
}
Run Code Online (Sandbox Code Playgroud) 我想在我的应用中实现"Google即时"之类的列表.在顶部有一个editText,在它下面有一个列表,每次用户输入一个新字符时都会更新.
你能指出我正确的方向吗?是否有任何小部件或任何我可以使用或做的事情我必须删除列表并在每次用户输入内容时重新创建它?
先谢谢迈克
我的问题被标记为这个问题的可能重复:如何在没有循环的情况下组合两个词典?
我相信我的问题是不同的,因为我问的是如何以特定的方式组合两个词典:我希望Dictionary1中的所有项目加上Dictionary2中不存在的所有项目(即密钥不存在).
我有两个这样的词典:
var d1 = new Dictionary<string,object>();
var d2 = new Dictionary<string,object>();
d1["a"] = 1;
d1["b"] = 2;
d1["c"] = 3;
d2["a"] = 11;
d2["e"] = 12;
d2["c"] = 13;
Run Code Online (Sandbox Code Playgroud)
我想将它们组合成一个新的词典(从技术上讲,它不必是一个字典,它可能只是一个序列KeyValuePairs),以便输出包含所有KeyValuePairs来自d1和只有KeyValuePairs,d2其Key不会出现在d1.
概念:
var d3 = d1.Concat(d2.Except(d1))
Run Code Online (Sandbox Code Playgroud)
但这给了我d1和d2的所有元素.
似乎它应该是显而易见的,但我必须遗漏一些东西.
我遇到了一个我无法解决的奇怪问题,无论我尝试过什么.也许我只是忽略了一些基本因素,但我完全没有想法,所以我当然希望任何人都可以帮助我.
我有一个for循环,它无法正常工作.有趣的是,几乎相同的一个工作得很好.问题是,当i <int时它不会停止(显然),而是继续前进(当然)会在Array处抛出IndexOutOfBounds异常.我很难解释这个,我想我只是"让代码说话":[注意:我编辑了方法调用和其他东西 - 我可以保证 - 与问题无关,制作代码更可读]
for (int i = GeneralVars.intStartAtLine; i < (GeneralVars.intEndAtLine + 1); i++)
{
for (int j = 0; j < 49; j++)
a++;
if (boolCheck == true)
{
for (int j = 0; j < 6; j++)
{
if (z[i].zahlen7[j].nummer != 0)
{
if ((z[i].zahlen7[j + 1].nummer - z[i].zahlen7[j].nummer) == 1)
{
//dosomestuff
}
}
}
if (z[i].zahlen7[0].nummer != 0)
{
if (a == b)
{
//do some stuff
}
}
}
else
{ …Run Code Online (Sandbox Code Playgroud)