我有一个函数,它将XDocument对象作为参数.
我需要遍历不同集合中的许多其他对象,并为这些对象中的每一个对XDocument执行一些操作.但lopp的每次迭代都需要传递给函数的原始XDocument的原始副本.
但是,如果我只是尝试对传递给函数的变量执行操作,它就像一个指针 - 所以循环的每次迭代都会在最后一次迭代结束时留下的任何状态下接收XDocument,这对于所有.
显然我需要复制一份Xdocument,但我看不出这样做的直接方式.试:
XDocument currentServerXml = XDocumentFromFunction.Document():
Run Code Online (Sandbox Code Playgroud)
然后使用currentServerXml而不是XDocumentFromFunction获取具有相同指针和相同行为的相同副本.
如何为循环的每次迭代创建全新的数据副本?
好的,所以我已经设置并测试了一个不错的小WCF服务.客户端创建一个字符串并将其传递给服务上的方法,然后服务将其保存为文件.与少量的测试数据完美配合,但是当我尝试它应该做的事情时 - 传递一些序列化的.net对象 - 它会因错误而失败
格式化程序在尝试反序列化消息时抛出异常:在读取XML数据时,已超出操作最大字符串内容长度配额(8192)的反序列化请求消息正文中的错误.通过更改创建XML阅读器时使用的XmlDictionaryReaderQuotas对象的MaxStringContentLength属性,可以增加此配额
所以我对此进行了调整,发现应该在配置文件的标记内的"readerQuotas"标记上设置MaxStringContentLength属性,如下所示:
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
Run Code Online (Sandbox Code Playgroud)
所以我改变它.我在我的客户端的App.config文件上更改它.我在App.config文件和我的服务器的Web.config文件中更改它.我在我的单元测试项目的App.config文件中更改它.它都不起作用 - 我一直得到同样的错误.
有趣,令人沮丧的是,当我启动WcfClient.exe来查看我的服务,连接到它并查看配置文件(Client.dll.config)时,我发现这个自动生成的文件已经被大惊小怪了我的所有更改都没有重置为:
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
Run Code Online (Sandbox Code Playgroud)
我不知道它从哪里得到这些值 - 在我的整个解决方案中没有任何地方设置这些.所以它必须使用默认值,但我不明白为什么当我在服务器和客户端都提供自定义配置文件时它使用默认值.
任何人都可以帮我解开这个吗?
使用MongoDB的c#驱动程序,我可以轻松地构建一个查询,然后我可以添加SetSkip()和SetLimit()参数来将结果集限制为一定的大小.
但是我希望能够在不执行查询并将整个结果集(可能很大)加载到内存中之前应用Skip和Take之前知道查询的项目数.
看起来我可以通过使用count()命令直接通过shell对MongoDB执行此操作.例如:
db.item.find( { "FieldToMatch" : "ValueToMatch" } ).count()
Run Code Online (Sandbox Code Playgroud)
这只返回一个整数,这正是我想要的.但我在文档中看不到通过C#驱动程序执行此操作的方法.可能吗?
(应该注意的是,我们已经广泛使用了查询构建器,所以理想情况下我宁愿通过查询构建器执行此操作,而不是通过驱动程序向shell发出命令,如果可能的话.但如果这是唯一的话解决方案然后一个例子会有所帮助,谢谢.)
干杯,马特
在Bootstrap 3中SE有几个关于这个问题的问题,已经通过添加自定义类解决了。Bootstrap 4 包含一个text-truncate 类来限制元素内文本的显示。我们已经在网站的某些部分使用它没有问题。
但是,它在应用于表格单元格时不起作用。这是我们尝试过的 - 实际上,表格中有多个列,但我已将其缩减为一列。
<table class="table table-striped table-bordered table-hover table-hover-cursor" id="tblData">
<thead class="thead-light">
<tr>
<th scope="col" data-bind="tableSort: { arr: _data, propName: 'text()'}">Text</th>
</tr>
</thead>
<tbody data-bind="foreach: pagedData">
<tr>
<td data-bind="text: text()" class="text-truncate"></td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
关于此还有其他各种问题,建议您需要将文本放在跨度内才能使其工作。但这也行不通。
<tr>
<td>
<span data-bind="text: text()" class="text-truncate"></span>
</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
我也试过把班级移到 td 并将它放在 td 和 span 上。它都不起作用。
另一个常见的建议是添加文本类。尽管这似乎不是 Bootstrap 中的默认类。这也行不通。
<tr>
<td>
<span data-bind="text: text()" class="text text-truncate"></span>
</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
同样,在 td 上移动或复制类没有任何区别。我不确定是否可能需要大小限制,所以我尝试了这个:
<tr>
<td data-bind="text: text()" class="col-md-2 text-truncate"></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
但是文本仍然完整显示,没有省略号。 …
好吧,我可能在这里误解了一些东西,但据我所知......
换句话说,你不能在名为"MyExtensionMethod"的String上创建一个扩展方法并使用:
String.MyExtensionMethod("String")
Run Code Online (Sandbox Code Playgroud)
但反而 ..
Dim test As String
test.MyExtensionMethod("string")
Run Code Online (Sandbox Code Playgroud)
它是否正确?或者有没有办法让扩展方法作为静态方法工作?
标题应该清楚我要做的事情 - 获取Entity Framework对象,将其序列化为字符串,将字符串保存在文件中,然后从文件加载文本并将其重新序列化为对象.嘿presto!
但当然它不起作用,否则我不会在这里.当我尝试重新编写时,我得到一个"输入流不是有效的二进制格式"错误,所以我显然在某处遗漏了某些东西.
这是我序列化和保存数据的方式:
string filePath = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteSavePath"];
string fileName = System.Configuration.ConfigurationManager.AppSettings["CustomersLiteFileName"];
if(File.Exists(filePath + fileName))
{
File.Delete(filePath + fileName);
}
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, entityFrameWorkQuery.First());
string str = System.Convert.ToBase64String(memoryStream.ToArray());
StreamWriter file = new StreamWriter(filePath + fileName);
file.WriteLine(str);
file.Close();
Run Code Online (Sandbox Code Playgroud)
这给了我一个很大的荒谬的文本文件,正如你所期望的那样.然后我尝试在别处重建我的对象:
CustomerObject = File.ReadAllText(path);
MemoryStream ms = new MemoryStream();
FileStream fs = new FileStream(path, FileMode.Open);
int bytesRead;
int blockSize = 4096;
byte[] buffer = new byte[blockSize];
while (!(fs.Position == fs.Length))
{
bytesRead = …Run Code Online (Sandbox Code Playgroud) 在一些C#代码中看到一些奇怪的行为,我无法解释.可能是我错过了一点重要的理解,所以希望有人可以为我打开灯.
得到一块看起来像这样的代码:
IEnumberable<myObject> objects = GetObjectsFromApiCall();
for (int i = 0; i < objects.Count(); i++)
{
if (String.IsNullOrEmpty(objects.ElementAt(i).SubObject.Title))
{
SubObject sub = GetSubObjectFromDatabase((long)objects.ElementAt(i).SubObject.Id);
if (sub != null)
{
objects.ElementAt(i).SubObject.Title = sub.Title;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当您单步执行它时,有关此代码的所有内容似乎都能正常运行."对象"集合按预期填充."sub"被收集并具有一整套预期属性,包括填充的Title属性.执行期间不会抛出任何错误.
但是......每个Object中存在的SubObject.Title属性(只有标准的get; set;代码)固执地保持为空.
我不知所措.有谁解释发生了什么?
编辑:对于那些建议我不应该使用for循环和ElementAt的人,我开始使用foreach循环,但认为它可能是问题的根源,因为它每次都会获取一个新的SubObject.现在修复,感谢您的帮助,并恢复了ForEach.
干杯,马特
在实现我的课程之后,目前处于实质性的重构工作中.我试图分解一些事情,更好地遵循SRP,但我总是发现很难评估一个班级是否有"改变的一个理由"的格言.我希望这个实际的例子可以帮助我理解.
有问题的代码旨在清理数据.目前这里有两个独立的进程 - 我们通过使用通过代码调用的外部应用程序来清理地址数据.我们使用C#中的内部算法清理其他数据字段.
当我被告知我们可能希望将来更改这两个进程时,这个重构就开始了 - 例如,使用数据库存储过程来执行这两个作业而不是C#代码和外部应用程序.所以我的第一直觉是将这两个函数隐藏在接口后面(FileRow并且FileContents只是DTO):
public interface IAddressCleaner
{
string CleanAddress(StringBuilder inputAddress);
void CleanFile(FileContents fc);
}
public interface IFieldCleaner
{
string CleanPhoneNumber(string phoneToClean);
void CleanAllPhoneFields(FileRow row, FileContents fc);
void MatchObscentities(FileRow row, FileContents fc);
void CleanEmailFields(FileRow row, FileContents fc);
}
Run Code Online (Sandbox Code Playgroud)
哪个好.然而,实际上,我无法想象一个班级会在没有其他班级的情况下使用其中一个.因此将它们(及其实现)合并到一个类中似乎是有意义的.这也是有道理的,因为我们可以用一个解决方案(如数据库)替换这两个函数.
另一方面,似乎IFieldCleaner已经违反了SRP,因为它正在做三件事:清理电话号码,发送电子邮件和寻找粗鲁的话语,所有这些都是逻辑上不同的过程.所以似乎有理由把它分成一个IPhoneCleaner,IObscenityMatcher和IEmailCleaner.
对后一种方法特别困扰的是这些类在服务中使用,该服务已经具有愚蠢的接口依赖性:
public class ReadFileService : IExecutableObject
{
private ILogger _log;
private IRepository _rep;
private IFileHelper _fileHelp;
private IFieldCleaner _fieldCleaner;
private IFileParser _fileParser;
private IFileWriter _fileWriter; …Run Code Online (Sandbox Code Playgroud) c# architecture interface single-responsibility-principle solid-principles
在 SQL Server 中有一个表,其中包含一个varchar带有日期数据的列。不幸的是,日期有很多不同的格式。
2012-05-01
27/05/2012
07MAY2014
19/07/13
Run Code Online (Sandbox Code Playgroud)
可能还有其他人,但这就是我目前遇到的所有情况。
我需要将它们压缩datetime到另一个表中的一列中,因此我一直试图将它们选择为标准日期时间值。起初,我认为这很容易:
UPDATE myTable
SET myDateColumn = CONVERT(DATETIME, myDateColumn, 103)
WHERE ISDATE(myDateColumn) = 0
Run Code Online (Sandbox Code Playgroud)
但问题是 SQL Server 将dd/mm/yy和dd/mm/yyyy视为单独的格式。前者是代码 3,后者是代码 103。所以无论我以哪种方式运行该更新,它都会以相反的格式窒息。
有什么方法可以根据日期格式选择/更新,并将所有这些日期转换为单一有效DateTime格式?
此问题之前已被问过数百次,但所提出的解决方案似乎都没有效果.
我正在Visual Studio 2013中构建一个MVC5项目.它运行正常.但是,在VS中的所有.cshtml页面中,所有内联Razor代码都用红色下划线,好像这是一个错误.@model并ViewBag声明它们在当前背景下不存在.Html.ActionLink声明它不包含ActionLink的定义.不同对象上还有其他错误,并且智能感知被破坏.
构建项目时也会显示这些错误.奇怪的是,我们已经在TFS上进行了一次门禁登记,并且它的构建就好了.
MVC和Razor通过NuGet安装.Nuget告诉我,MBC的版本是5.2.3,安装的Razor版本是3.2.3.
Views文件夹中有一个web.config文件,它看起来像这样:
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
</configSections>
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="MyProjectNamespace" />
</namespaces>
</pages>
</system.web.webPages.razor>
<appSettings>
<add key="webpages:Enabled" value="false" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
主web.config文件中包含以下部分:
<dependentAssembly> …Run Code Online (Sandbox Code Playgroud) .net ×5
c# ×3
architecture ×1
asp.net-mvc ×1
bootstrap-4 ×1
css ×1
date ×1
datetime ×1
html ×1
interface ×1
linq ×1
linq-to-xml ×1
mongodb ×1
razor ×1
single-responsibility-principle ×1
sql ×1
sql-server ×1
t-sql ×1
wcf ×1
xml ×1