我有一个简单的方法来比较FileInfo对象的数组与文件名列表,以检查已经处理了哪些文件.然后返回未处理的列表.
此方法的循环迭代大约250,000个FileInfo对象.这需要花费大量的时间来参加比赛.
效率低下显然是对processedFiles集合的Contains方法调用.
首先,我如何检查以确保我对原因的怀疑是肯定的;其次,我如何改进方法以加快处理速度?
public static List<FileInfo> GetUnprocessedFiles(FileInfo[] allFiles, List<string> processedFiles)
{
List<FileInfo> unprocessedFiles = new List<FileInfo>();
foreach (FileInfo fileInfo in allFiles)
{
if (!processedFiles.Contains(fileInfo.Name))
{
unprocessedFiles.Add(fileInfo);
}
}
return unprocessedFiles;
}
Run Code Online (Sandbox Code Playgroud) 如果我要有一个包含n行的整数列的表,并想检查它们是否连续,我该怎么办呢?
DECLARE @Temp TABLE
(
IntegerValue INT,
Processed BIT
)
Run Code Online (Sandbox Code Playgroud)
我有一个解决方案,适用于3行,但这是无穷无尽的,如果要求改变那么查询也是如此(忽略我的总和在这种情况下不起作用的事实).
@SumOfValues = (@FirstValue * @NumOfValues) + @NumOfValues
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用多个生产者和一个消费者来实现一个相当简单的生产者/消费者风格的应用程序.
研究让我进入了BlockingCollection<T>有用的领域,并允许我实现一个长期运行的消费者任务,如下所示:
var c1 = Task.Factory.StartNew(() =>
{
var buffer = new List<int>(BATCH_BUFFER_SIZE);
foreach (var value in blockingCollection.GetConsumingEnumerable())
{
buffer.Add(value);
if (buffer.Count == BATCH_BUFFER_SIZE)
{
ProcessItems(buffer);
buffer.Clear();
}
}
});
Run Code Online (Sandbox Code Playgroud)
该ProcessItems函数将缓冲区提交给数据库,并且它可以批量工作.然而,该解决方案是次优的.在男爵生产期间,可能需要一段时间才能填充缓冲区,这意味着数据库已过期.
更理想的解决方案是在30秒计时器上运行任务或foreach在超时时短路.
我跑了计时器的想法,想出了这个:
syncTimer = new Timer(new TimerCallback(TimerElapsed), blockingCollection, 5000, 5000);
private static void TimerElapsed(object state)
{
var buffer = new List<int>();
var collection = ((BlockingCollection<int>)state).GetConsumingEnumerable();
foreach (var value in collection)
{
buffer.Add(value);
}
ProcessItems(buffer);
buffer.Clear();
}
Run Code Online (Sandbox Code Playgroud)
这有明显的问题,foreach将被阻止直到结束,打败计时器的目的.
任何人都可以提供指导吗?我基本上需要BlockingCollection定期快照并处理内容清除它.也许BlockingCollection …
我目前填充业务对象的方式是使用类似于下面的代码段.
using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.CDRDatabase))
{
using (SqlCommand comm = new SqlCommand(SELECT, conn))
{
conn.Open();
using (SqlDataReader r = comm.ExecuteReader(CommandBehavior.CloseConnection))
{
while (r.Read())
{
Ailias ailias = PopulateFromReader(r);
tmpList.Add(ailias);
}
}
}
}
private static Ailias PopulateFromReader(IDataReader reader)
{
Ailias ailias = new Ailias();
if (!reader.IsDBNull(reader.GetOrdinal("AiliasId")))
{
ailias.AiliasId = reader.GetInt32(reader.GetOrdinal("AiliasId"));
}
if (!reader.IsDBNull(reader.GetOrdinal("TenantId")))
{
ailias.TenantId = reader.GetInt32(reader.GetOrdinal("TenantId"));
}
if (!reader.IsDBNull(reader.GetOrdinal("Name")))
{
ailias.Name = reader.GetString(reader.GetOrdinal("Name"));
}
if (!reader.IsDBNull(reader.GetOrdinal("Extention")))
{
ailias.Extention = reader.GetString(reader.GetOrdinal("Extention"));
}
return ailias;
}
Run Code Online (Sandbox Code Playgroud)
有没有人有任何关于如何改善这样的表现的建议?请记住,对于某些类型,PopulateFromReader包含更多数据库查找,以便完全填充对象.
正如标题所示,我需要一个C#equivelant of ROUNDDOWN.
例如,如果你采用图13.608000,我正在寻找的输出是13.60.
我似乎无法找到任何涵盖我所追求的东西.
业务对象是否应包含对其他对象的引用(如在id字段中引用另一个数据库记录),或者它是否应包含实际对象的实例.
例如:
public class Company
{
public int Id { get; set; }
public CompanyStatus Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
要么
public class Company
{
public int Id { get; set; }
public int Status { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我有一些数字相当大,复杂的xml文档,我需要循环.xmlns定义在文档的顶部,但是指向的url不再可用.
解析文件以使用C#从中获取重要数据的最佳方法是什么?
我试图将其加载到数据集中但偶尔会收到错误:表(端点)不能是嵌套关系中的子表.或者无法将SimpleContent列添加到包含元素列或嵌套关系的表中.
XPath是我的下一个调用端口,但由于缺少命名空间,我遇到了问题.
我怀疑这严重限制了我的选择,但有人有任何建议吗?
XML文档的片段:
<?xml version="1.0" encoding="UTF-8"?>
<cdr:cdr_set xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr">
<!-- Copyright (c) 2001-2009, all rights reserved -->
<cdr:cdr xmlns:cdr="http://www.naturalconvergence.com/schema/cdr/v3/cdr">
<cdr:call_id>2040-1247062136726-5485131</cdr:call_id>
<cdr:cdr_id>1</cdr:cdr_id>
<cdr:status>Normal</cdr:status>
<cdr:responsibility>
<cdr:tenant id="17">
<cdr:name>SpiriTel plc</cdr:name>
</cdr:tenant>
<cdr:site id="45">
<cdr:name>KWS</cdr:name>
<cdr:time_zone>GB</cdr:time_zone>
</cdr:site>
</cdr:responsibility>
<cdr:originator type="sipGateway">
<cdr:sipGateway id="3">
<cdr:name>Audiocodes-91</cdr:name>
</cdr:sipGateway>
</cdr:originator>
<cdr:terminator type="group">
<cdr:group>
<cdr:tenant id="17">
<cdr:name>SpiriTel plc</cdr:name>
</cdr:tenant>
<cdr:type>Broadcast</cdr:type>
<cdr:extension>6024</cdr:extension>
<cdr:name>OLD PMS DDIS DO NOT USE</cdr:name>
</cdr:group>
</cdr:terminator>
<cdr:initiation>Dialed</cdr:initiation>
<cdr:calling_number>02087893850</cdr:calling_number>
<cdr:dialed_number>01942760142</cdr:dialed_number>
<cdr:target>6024</cdr:target>
<cdr:direction>Inbound</cdr:direction>
<cdr:disposition>No Answer</cdr:disposition>
<cdr:timezone>GB</cdr:timezone>
<cdr:origination_timestamp>2009-07-08T15:08:56.727+01:00</cdr:origination_timestamp>
<cdr:release_timestamp>2009-07-08T15:09:26.493+01:00</cdr:release_timestamp>
<cdr:release_cause>Normal Clearing</cdr:release_cause>
<cdr:call_duration>PT29S</cdr:call_duration>
<cdr:redirected>false</cdr:redirected>
<cdr:conference>false</cdr:conference>
<cdr:transferred>false</cdr:transferred>
<cdr:estimated>false</cdr:estimated>
<cdr:interim>false</cdr:interim>
<cdr:segments> …Run Code Online (Sandbox Code Playgroud) c# ×6
performance ×2
.net ×1
idatareader ×1
rounding ×1
sql-server ×1
t-sql ×1
task ×1
xml ×1
xpath ×1