使用时ToList()
,是否需要考虑性能影响?
我正在编写一个查询来从目录中检索文件,这是查询:
string[] imageArray = Directory.GetFiles(directory);
但是,由于我喜欢与之合作List<>
,我决定投入......
List<string> imageList = Directory.GetFiles(directory).ToList();
那么,在决定进行这样的转换时是否应该考虑某种性能影响 - 或者仅在处理大量文件时考虑?这是一个微不足道的转换?
什么是最好/最简单的方法来获取IEnumerable集合中的项目数而不枚举集合中的所有项目?
可以使用LINQ或Lambda吗?
我有以下方法返回一个IEnumerable
类型T
.该方法的实现并不重要,除了yield return
到延迟加载的IEnumerable
.这是必要的,因为结果可能有数百万项.
public IEnumerable<T> Parse()
{
foreach(...)
{
yield return parsedObject;
}
}
Run Code Online (Sandbox Code Playgroud)
问题:
我有以下属性可用于确定是否IEnumerable
有任何项目:
public bool HasItems
{
get
{
return Parse().Take(1).SingleOrDefault() != null;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
我从Interop
库切换到OpenXML
,因为我需要读取大Excel
文件.在此之前,我可以使用:
worksheet.UsedRange.Rows.Count
Run Code Online (Sandbox Code Playgroud)
获取工作表上包含数据的行数.我使用这些信息来制作进度条.在OpenXML中,我不知道如何获得有关工作表的相同信息.我现在拥有的是这段代码:
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(path, false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
int row_count = 0, col_count;
// here I would like to get the info about the number of rows
foreach (Row r in sheetData.Elements<Row>())
{
col_count = 0;
if (row_count > 10)
{
foreach (Cell c in r.Elements<Cell>())
{
// do some stuff
// update progressbar
}
}
row_count++;
}
}
Run Code Online (Sandbox Code Playgroud) 当我需要执行以下操作时,我试图找出 LINQ 的正确约定是什么
"No items"
我想这样做的方式就像
if (items.Any())
{
foreach (string item in items)
{
Console.WriteLine(item);
}
}
else
{
Console.WriteLine("No items");
}
Run Code Online (Sandbox Code Playgroud)
然而,这在技术上违反了多重枚举原则。一种不违反这一点的方法是
bool any = false;
foreach (string item in items)
{
any = true;
Console.WriteLine(item);
}
if (!any)
{
Console.WriteLine("No items");
}
Run Code Online (Sandbox Code Playgroud)
但显然,这不太优雅。
我正在编写一些代码,然后去获取 IEnumerable 的长度。当我写的时候myEnumerable.Count()
,令我惊讶的是,它没有编译。在阅读了 IEnumerable Count() 和 Length 之间的差异后,我意识到实际上是 Linq 为我提供了扩展方法。
使用 .Length 也不适合我。我使用的是旧版本的 C#,所以也许这就是原因。
获取 IEnumerable 长度的最佳实践是什么?我应该使用 Linq 的 Count() 方法吗?或者有更好的方法。.Length 在更高版本的 C# 中可用吗?
或者,如果我需要计数,IEnumerable 是否是该工作的错误工具?我应该改用 ICollection 吗? 在不迭代的情况下计算 IEnumerable<T> 中的项目?说 ICollection 是一个解决方案,但是如果您想要一个带有计数的 IEnumerable,它是否是正确的解决方案?
强制性代码片段:
var myEnumerable = IEnumerable<Foo>();
int count1 = myEnumerable.Length; //Does not compile
int count2 = myEnumerable.Count(); //Requires Linq namespace
int count3 = 0; //I hope not
for(var enumeration in myEnumerable)
{
count3++;
}
Run Code Online (Sandbox Code Playgroud) Rider/ReSharper 给了我可能的多重枚举警告:
public void ProcessProductCodes(IEnumerable<string> productCodes) {
if (productCodes.Any()) {
DoStuff(productCodes);
}
}
Run Code Online (Sandbox Code Playgroud)
这是误报,还是 Any() 函数确实搞乱了集合的枚举?
我有一系列由以下表示的项目IEnumerable
我需要循环遍历这些项目,它应该是 afor-loop
因为索引很重要。
我的问题是,以下两个选项之间的性能有区别吗?
1.
for (int i = 0; i < items.Count(); i++)
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
var itemsLength = items.Count();
for (int i = 0; i < itemsLength; i++)
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
换句话说,该方法是否items.Count()
在选项 1 中的每次迭代中一次又一次地运行?
我试图获取存储在Ienumerable对象中的元素的计数.这没有count属性,所以我如何得到var对象的计数?
谢谢
我有一个名为AxiomSubset
6列的C#列表,其中有几行数据,我想检查列表中特定列的所有值是否相等,如果它们相等则应返回true并转到下一列列并检查它们的相等性等.
例如,我在列表中有以下数据行
CC Mon str stg rate units
HP 15-Mar 4.0800 4
HP 15-Feb 4.0800 4
HP 15-Jan 4.0800 4
LN 15-Mar 3.25 Put 0.0500 50
LN 15-Feb 3.25 Put 0.0500 50
LN 15-Jan 3.25 Put 0.0500 50
LN 15-Mar 3.50 Put 0.1000 50
LN 15-Feb 3.50 Put 0.1000 50
LN 15-Jan 3.50 Put 0.1000 50
Run Code Online (Sandbox Code Playgroud)
在上面的数据中检查列的相等性时,CC
它应该返回false,因为它们都不相等
我尝试按如下方式进行操作,将一行与前一行进行比较,显然没有给出预期的结果
for (int i = 0; i < AxiomSubSet.Count; i++)
{
if (AxiomSubSet[i].CC.ToString() == AxiomSubSet[i + 1].CC.ToString())
{
result …
Run Code Online (Sandbox Code Playgroud) c# ×10
linq ×4
.net ×3
ienumerable ×3
performance ×3
list ×2
algorithm ×1
arrays ×1
count ×1
for-loop ×1
lazy-loading ×1
openxml ×1