假设我有一个我要比较的数组/列表.在我更熟悉的语言中,我会做类似的事情
for (int i = 0, i < mylist.size(); i++)
for (int j = i + 1, j < mylist.size(); j++)
compare(mylist[i], mylist[j])
Run Code Online (Sandbox Code Playgroud)
这确保我们只比较每对一次.对于某些上下文,我正在对列表中包含的一堆对象进行冲突检测.对于检测到的每个碰撞,描述碰撞的小"碰撞"对象被附加到列表,然后另一个例程循环解决每个碰撞(取决于两个碰撞对象的性质).显然,我只想报告每次碰撞一次.
现在,这样做的pythonic方法是什么,因为Python倾向于使用迭代器而不是循环索引?
我有以下(错误)代码:
for this in mylist:
for that in mylist:
compare(this, that)
Run Code Online (Sandbox Code Playgroud)
但这显然会在每次碰撞中发生两次,这在尝试解决它们时会导致一些奇怪的行为.那么这里的pythonic解决方案是什么?
警告:非常详细的帖子.
好的,在使用MVVM时验证WPF.我现在已经阅读了很多东西,看了很多SO问题,并尝试了很多方法,但是在某些方面我觉得有点哈哈,我真的不确定如何以正确的方式做到这一点.
理想情况下,我希望在视图模型中使用IDataErrorInfo; 这就是我做的.然而,有不同的方面使得该解决方案不是整个验证主题的完整解决方案.
我们采用以下简单形式.如你所见,它没什么特别的.我们只有两个文本框,它们分别绑定到视图模型中的a string和intproperty.此外,我们有一个绑定到的按钮ICommand.

因此,对于验证,我们现在有两个选择:
理想情况下,我想实现选择1.对于激活的普通数据绑定,ValidatesOnDataErrors这是默认行为.因此,当文本更改时,绑定会更新源并触发IDataErrorInfo对该属性的验证; 错误报告回视图.到现在为止还挺好.
有趣的是让视图模型或这种情况下的按钮知道是否有任何错误.方式IDataErrorInfo有效,主要是将错误报告给视图.因此,视图可以轻松查看是否存在任何错误,显示它们甚至显示注释Validation.Errors.此外,验证总是发生在单个属性上.
因此,让视图模型知道何时出现任何错误,或者验证是否成功,是非常棘手的.一个常见的解决方案是简单地触发IDataErrorInfo视图模型本身中所有属性的验证.这通常使用单独的IsValid属性来完成.好处是,这也可以很容易地用于禁用命令.缺点是这可能会经常对所有属性进行验证,但大多数验证应该足够简单,不会影响性能.另一个解决方案是记住哪些属性使用验证产生错误并且只检查那些,但这似乎有点过于复杂并且大多数时候都是不必要的.
最重要的是,这可以正常工作.IDataErrorInfo为所有属性提供验证,我们可以简单地在视图模型本身中使用该接口来为整个对象运行验证.介绍问题:
视图模型使用实际类型作为其属性.所以在我们的例子中,整数属性是实际的int.视图中使用的文本框本身仅支持文本.因此,当绑定到int视图模型时,数据绑定引擎将自动执行类型转换 - 或者至少它会尝试.如果你可以在一个用于数字的文本框中输入文本,那么内部不会总是存在有效数字的可能性很高:所以数据绑定引擎将无法转换并抛出一个FormatException.

从观点来看,我们可以很容易地看到这一点.来自绑定引擎的异常会被WPF自动捕获并显示为错误 - 甚至不需要启用Binding.ValidatesOnExceptionssetter中抛出的异常所需的异常.错误消息确实有一个通用文本,所以这可能是一个问题.我通过使用Binding.UpdateSourceExceptionFilter处理程序,检查抛出的异常并查看source属性然后生成一个不太通用的错误消息来解决这个问题.所有这些都封装在我自己的Binding标记扩展中,所以我可以拥有我需要的所有默认值.
所以观点很好.用户出错,看到一些错误反馈并可以纠正它.然而,视图模型丢失了.当绑定引擎抛出异常时,源从未更新过.因此,视图模型仍然是旧值,这不是向用户显示的内容,并且IDataErrorInfo验证显然不适用.
更糟糕的是,视图模型没有很好的方法来了解这一点.至少,我还没有找到一个好的解决方案.可能的是让视图报告返回到视图模型,表明存在错误.这可以通过将Validation.HasError属性绑定到视图模型(这是不可能直接)的数据来完成,因此视图模型可以首先检查视图的状态.
另一种选择是将处理的异常中继Binding.UpdateSourceExceptionFilter到视图模型中,因此也会通知它.视图模型甚至可以为绑定提供一些接口来报告这些内容,允许自定义错误消息而不是通用的每类型消息.但是这会产生从视图到视图模型的更强耦合,我通常希望避免这种耦合.
另一个"解决方案"是删除所有类型属性,使用普通string属性并在视图模型中进行转换.这显然会将所有验证都移到视图模型中,但也意味着数据绑定引擎通常会处理大量重复的事情.此外,它将改变视图模型的语义.对我来说,视图是为视图模型而不是反过来构建的 - 当然视图模型的设计取决于我们想象的视图,但是视图如何做到这一点仍然是一般的自由.所以视图模型定义了一个int属性,因为有一个数字; 视图现在可以使用文本框(允许所有这些问题),或使用本机与数字一起使用的东西.所以不,改变属性的类型 …
复制列表的最佳方法是什么?我知道以下方法,哪一个更好?或者还有另一种方式吗?
lst = ['one', 2, 3]
lst1 = list(lst)
lst2 = lst[:]
import copy
lst3 = copy.copy(lst)
Run Code Online (Sandbox Code Playgroud) 我想使用实例的属性值将默认参数传递给实例方法:
class C:
def __init__(self, format):
self.format = format
def process(self, formatting=self.format):
print(formatting)
Run Code Online (Sandbox Code Playgroud)
尝试时,我收到以下错误消息:
NameError: name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)
我希望该方法的行为如下:
C("abc").process() # prints "abc"
C("abc").process("xyz") # prints "xyz"
Run Code Online (Sandbox Code Playgroud)
这里有什么问题,为什么这不起作用?我怎么能做这个工作?
有没有人知道一个非常简单的方法,只是将字符串的第一个字母大写,而不管字符串其余部分的大小写?
例如:
asimpletest -> Asimpletest
aSimpleTest -> ASimpleTest
Run Code Online (Sandbox Code Playgroud)
我希望能够完成所有字符串长度.
.Net 之间ConcurrentQueue和之间有什么区别BlockingCollection?
为什么BlockingCollection最好的生产者 - 消费者操作可以通过ConcurrentQueue?我是否必须改进以下代码中的任何内容?
MessageSlotMachineGameStartOrAndStatusUpdate msg;
while (!aCancellationToken.IsCancellationRequested)
{
try
{
this.isStillConsumingMsg = true;
Boolean takeResult = this.msgQueue.TryTake(out msg, this.msgConsumeTimeOut, aCancellationToken);
if (takeResult)
{
if (msg != null)
{
this.ProcessMessage(msg);
}
}
else
{
break;
}
}
catch (OperationCanceledException err)
{
EngineManager.AddExceptionLog(err, "Signal Operation Canceled");
}
catch (Exception err)
{
EngineManager.AddExceptionLog(err, "Signal exception");
}
finally
{
this.isStillConsumingMsg = false;
}
}
Run Code Online (Sandbox Code Playgroud) 如何str.format在Python中截断字符串?它甚至可能吗?
格式规范迷你语言中width提到了一个参数:
format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type]
...
width ::= integer
...
Run Code Online (Sandbox Code Playgroud)
但是明确指定它只适用于填充,而不是截断:
>>> '{:5}'.format('aaa')
'aaa '
>>> '{:5}'.format('aaabbbccc')
'aaabbbccc'
Run Code Online (Sandbox Code Playgroud)
所以它实际上是宽度的最小宽度.
我知道我可以对字符串进行切片,但是我在这里处理的数据是完全动态的,包括格式字符串和进入的args.我不能只是去明确切片.
是否可以在LINQPad中添加对程序集的引用?
我的程序集中有一些类型,我想在LINQPad查询中使用它们.
在创建测试项目或将应用程序和测试升级到ASP.NET Core 2.1/.NET Core 2.1时,运行测试会因装配加载异常而失败
System.IO.FileNotFoundException:无法加载文件或程序集'Microsoft.AspNetCore,Version = 2.1.0.0,Culture = neutral,PublicKeyToken = adb9793829ddae60'.该系统找不到指定的文件.
添加对其他库的引用时,还会生成类似的警告
警告MSB3277:发现无法解析的"Microsoft.Extensions.Options"的不同版本之间发生冲突.
警告MSB3277:发现无法解析的"Microsoft.Extensions.Configuration.Abstractions"的不同版本之间发生冲突.
警告MSB3277:发现无法解析的"Microsoft.AspNetCore.Hosting.Abstractions"的不同版本之间发生冲突.
警告MSB3277:发现无法解析的"Microsoft.Extensions.DependencyInjection.Abstractions"的不同版本之间发生冲突.
警告MSB3277:发现无法解析的"Microsoft.AspNetCore.Http.Abstractions"的不同版本之间发生冲突.
警告MSB3277:发现无法解析的"Microsoft.AspNetCore.Http.Features"的不同版本之间发生冲突.
如何让测试项目用于测试ASP.NET Core 2.1应用程序?
我有一个创建一些XmlDocument的函数:
public string CreateOutputXmlString(ICollection<Field> fields)
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = Encoding.GetEncoding("windows-1250");
StringBuilder builder = new StringBuilder();
XmlWriter writer = XmlWriter.Create(builder, settings);
writer.WriteStartDocument();
writer.WriteStartElement("data");
foreach (Field field in fields)
{
writer.WriteStartElement("item");
writer.WriteAttributeString("name", field.Id);
writer.WriteAttributeString("value", field.Value);
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.Flush();
writer.Close();
return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我设置了一个编码,但在我创建XmlWriter后,它确实有utf-16编码.我知道这是因为字符串(和我猜想的StringBuilder)是用utf-16编码的,你无法改变它.
那么如何在编码属性设置为"windows-1250"的情况下轻松创建此xml?它甚至不必在这种编码中编码,它只需具有指定的属性.
编辑:它必须在.Net 2.0中,因此不能使用任何新的框架元素.