我正在编写 C# 代码来从现有 MongoDB 数据库中提取数据并将其放入各种 C# 类中。数据库的一部分是多态的:如果字段type是 A,则该文档中将存在一组特定字段。如果type是B,则将存在一组不同的字段。这是 的完美用例ScalarDiscriminatorConvention,所以我正在使用ScalarDiscriminatorConvention("type"). 但我不知道如何让 MongoDB 驱动程序使用该约定!
关于约定的 MongoDB 手册页让我认为这可行:
var pack = new ConventionPack();
pack.Add(new CamelCaseElementNameConvention());
pack.Add(new ScalarDiscriminatorConvention("type"));
ConventionRegistry.Register(
"My Custom Conventions",
pack,
t => t.FullName.StartsWith("MyNamespace."));
Run Code Online (Sandbox Code Playgroud)
但这会失败,因为它不像其他约定那样ScalarDiscriminatorConvention从接口派生。IConvention它派生自IDiscriminatorConvention,这是它自己的接口,但不派生自IConvention。并ConventionPack.Add期望一个IConvention参数。
那么如何注册不同的鉴别器字段呢?我已经翻阅 MongoDB 手册至少一个小时了,但我很茫然。他们似乎没有在我能找到的任何地方记录它。
我正在尝试使用XmlProvider来解析一些非常大的数据文件(大约50 MB).由于它们太大,使用真实数据文件作为样本是不切实际的,所以我创建了一个示例XML文件,我希望它是可用数据的代表性样本.但是,我并不是100%确定我已经覆盖了50兆字节文件中的所有可能元素,所以我试图验证我的样本是否具有代表性.我正在尝试使用反射来帮助验证,但我遇到了一个问题.
一,背景.我不确定的原因是因为我正在解析的XML文件基本上具有以下(非常扁平的)数据结构:
<root-element>
<object class="Foo" guid="Guid001">
<color>Brown</color>
<shape>Square</shape>
<children>
<childRef guid="Guid003" />
</children>
</object>
<object class="Bar" guid="Guid002">
<firstName>John</firstName>
<lastName>Smith</lastName>
</object>
<object class="Quux" guid="Guid003" parentGuid="Guid001">
<secondaryColor>Maroon</secondaryColor>
<stroke>Dashed</stroke>
<shape>Circle</shape>
</object>
<object class="Quux" guid="Guid004">
<color>Blue</color>
<stroke>Dotted</stroke>
<shape>Hexagon</shape>
</object>
</root-element>
Run Code Online (Sandbox Code Playgroud)
(在真实数据文件中,"Guid001"等是真正的GUID;但对于这个虚构的例子,我保持简单.)
基本上,它是一个包含大量object元素的平面数据文件,每个元素都来自该数据来自的程序中的C#类实例.元素半随机混合在一起,在同一数据文件中表示几个不同的类族.(这就是我的虚构数据文件将绘图形状与人物记录混合的原因 - 我正在使用的真实数据文件在单个文件中具有类似的关注点.)
正如我所说,我为我的代表性样本或多或少随机选择了一堆记录.我试图从每个班级中挑选至少一个,这样我就可以覆盖大部分属性名称,但是如果(例如)我最终选择Guid004用于Quux类而不是Guid003?然后我提供的类型实际上不知道该SecondaryColor属性.我想我可以.GetType()在我提供的类型上使用,然后调用.GetProperties()以获取我提供的类型认为它知道的所有属性的列表.但是当我这样做时:
let firstObject = rootElement.Objects[0]
printfn "%A" firstObject.GetType().GetProperties()
Run Code Online (Sandbox Code Playgroud)
相反,越来越命名属性的列表Color,Shape,Children,FirstName,等,我期待,我所得到的恰恰是2和性能,XElement和_Print.
我想,我可以遍历XElement …
在寻找答案时,我发现了几个与我的情况不太匹配的问题 - 所以我会问一个新问题.
我正在为数据结构编写一些FsCheck测试,我想在我构建的数据结构的每个副本上检查20个不同的属性.到目前为止我所做的是为每个属性编写一个谓词,然后我创建了一个谓词列表,我将依次调用它们List.forall,如下所示:
module PropertyChecks =
let ``Tail length plus tree length should equal vector length`` vec =
treeLength vec.root + Array.length vec.tail = vec.len
let ``The tail may only be empty iff the vector is empty`` vec =
(vec.len = 0) = (Array.length vec.tail = 0)
let ``The tail's length may not exceed tailMax`` vec =
Array.length vec.tail < tailMax
let ``If vec.len <= tailMax, all items are in tail and root is empty`` vec = …Run Code Online (Sandbox Code Playgroud) 我的以下代码有问题。我正在尝试创建字母和数字的随机字符串。下面的代码有效,但是每个会话只能创建1个随机字符串,因此,如果我再次调用randomNum,它将仍然保留创建的第一个随机字符串。
let randomNum(len : int) =
let rand = new System.Random()
let mutable str = ""
let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
let mutable count = 0
for i in 1 .. len do
count <- (rand.Next() % 36)
str <- String.concat "" [str; chars.[count].ToString()]
str
Run Code Online (Sandbox Code Playgroud)
有谁知道每次调用randomNum时创建随机字符串的简单方法。
谢谢
我尝试匹配下面的单引号:
s= "name:'abc','hello'"
Run Code Online (Sandbox Code Playgroud)
但似乎match/findall的行为是不同的:
re.match("\B'\w+'\B", s) # ===> return None
re.findall("\B'\w+'\B", s) #===> RETURN ['abc', 'hello']
Run Code Online (Sandbox Code Playgroud)
实际上这是由字符串中的单引号引起的,任何人都知道发生了什么?
我在win7中使用py2.7.8.
我是通过回答工作的不同的实例之间List.fold和List.foldBack试图让我周围的区别头部fold和foldBack.我现在理解应用程序顺序的差异,但是我不明白的副作用存在差异.
我用过List.fold和List.foldBack测试.我的累加器函数基本上等同于::,因此累加顺序很重要.我使用的累加器函数如下:
let f acc x =
// printfn "Folding %A into %A" x acc // Side-effect!
x :: acc
let f2 x acc =
// printfn "Folding %A into %A" x acc // Side-effect!
x :: acc
Run Code Online (Sandbox Code Playgroud)
我从F#参考中了解到:
List.fold f [] [1; 2; 3; 4; 5] = (f (f (f (f (f [] 1) 2) 3) 4) 5)
Run Code Online (Sandbox Code Playgroud)
和:
List.foldBack f2 [] [1; 2; 3; 4; 5] …Run Code Online (Sandbox Code Playgroud) 我需要在代码中调用函数我无法修改.该函数需要一个obj[],我想通过它'T[].我可以使用Array.map box,但我试图避免创建一个中间数组.是否有直接的方法将a转换'T[]为obj[]不通过Array.map box或任何其他将创建中间数组的代码?
我正在尝试编写需要与FSharpx.Collections中的PersistentVector类进行互操作的代码.(具体来说,我正在尝试在F#中实现RRB-Trees).PersistentVector基本上是一个B树,其分支因子为32.树中的每个节点都包含两个内容之一:其他节点(如果节点不是叶节点),或者存储在树中的项(如果节点)是一个叶子节点).现在,在F#中表示此数据结构的最自然的方式是使用类似的区分联合type Node<'T> = TreeNode of Node[] | LeafNode of 'T[].但是我认为是性能原因,FSharpx.Collections.PersistentVector代码定义了它的Node类,如下所示:
type Node(thread,array:obj[]) =
let thread = thread
new() = Node(ref null,Array.create Literals.blockSize null)
with
static member InCurrentThread() = Node(ref Thread.CurrentThread,Array.create Literals.blockSize null)
member this.Array = array
member this.Thread = thread
member this.SetThread t = thread := t
Run Code Online (Sandbox Code Playgroud)
线程代码与我当前的问题无关(它在瞬态向量中使用,它允许某些性能改进),所以让我们删除它以便创建问题的最简单的摘要.删除与线程相关的代码后,我们有一个如下所示的Node定义:
type Node(array:obj[]) =
new() = …Run Code Online (Sandbox Code Playgroud) 运行一些执行并行计算的代码时,输出变得混乱:不同的消息混淆了.这是一个示例:
Iteration 1
Iteration
Iteration 23 of 19 - Calculating P&L for test window ending at 10/28/1968 12:00:00 AM
of
Iteration 4
Iteration of
Iteration 5
Iteration
Iteration 19 - Calculating P&L for test window ending at of 19 - Calculating P&L for test window ending at 5/29/1974 12:00:00 AM
6 of 878/18/1971 12:00:00 AM19 - Calculating P&L for test window ending at 3/4/1977 12:00:00 AM
of 19 of
of 19 - Calculating P&L for test window ending at 6/25/1985 …Run Code Online (Sandbox Code Playgroud) 我正在尝试从存储库中实现以下C#代码:https://github.com/alexsorokoletov/Xamarin.iOS.DatePickerDialog
在F#中:
dialog.Show("Choose time", "Done", "Cancel", UIDatePickerMode.Time, (dt) =>
{
TimePickLabel.Text = dt.ToString();
}, startingTime);
Run Code Online (Sandbox Code Playgroud)
但是,F#似乎只期望以下格式的3个参数:
我理解如何填写title和datePickerMode参数,但是,我对回调有点困惑.我知道我应该使用fun语法,所以我尝试这样:
datePicker.Show("FROM", fun() -> (
Console.WriteLine("Testing")
),UIDatePickerMode.Date)
Run Code Online (Sandbox Code Playgroud)
但这会引发错误:
表达式预计有类型,DateTime但unit在后面的括号中有类型fun.
面向对象的编程范例使用继承来建模遵循泛化 - 专业化关系的实体之间的关系.这里,Base类用于封装一组实体的公共(常规)属性和行为,Derived Classes 通过添加其他属性和/或添加/修改现有行为来扩展基类.
作为功能编程的新手,我需要在F#等函数语言中建模这种关系的指导.
例如,建模如下所示的简单情况的最佳方法是什么:
abstract class Tutorial {
private String topic;
abstract public void learn();
}
class VideoTutorial extends Tutorial {
private float duration;
public void learn () {
System.out.println ("read PDF");
}
}
class PDFTutorial extends Tutorial {
private int pageCount;
public void learn () {
System.out.println ("Watch Video");
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用教程集合并调用学习 观察多态行为.
f# ×8
c# ×2
arrays ×1
closures ×1
console ×1
covariance ×1
fold ×1
inheritance ×1
ios ×1
mongodb ×1
oop ×1
python ×1
reflection ×1
regex ×1
xml ×1