说我有这个简单的方法:
public IEnumerable<uint> GetNumbers()
{
uint n = 0;
while(n < 100)
yield return n++;
}
Run Code Online (Sandbox Code Playgroud)
你会如何使这个线程安全?而且我的意思是你会得到一次枚举器,并且有多个线程处理所有数字而没有任何人得到重复.
我想在某个地方需要使用一个锁,但是哪个锁必须使迭代器块成为线程安全的呢?一般来说,如果你想要一个线程安全,你需要记住IEnumerable<T>什么?或者更确切地说,我猜这将是一个线程安全IEnumerator<T>...?
我正在尝试将DataTable转换为IEnumerable.其中T是我创建的自定义类型.我知道我可以通过创建一个List来实现它,但我认为使用IEnumerable有一种更流畅的方法.这就是我现在拥有的.
private IEnumerable<TankReading> ConvertToTankReadings(DataTable dataTable)
{
var tankReadings = new List<TankReading>();
foreach (DataRow row in dataTable.Rows)
{
var tankReading = new TankReading
{
TankReadingsID = Convert.ToInt32(row["TRReadingsID"]),
TankID = Convert.ToInt32(row["TankID"]),
ReadingDateTime = Convert.ToDateTime(row["ReadingDateTime"]),
ReadingFeet = Convert.ToInt32(row["ReadingFeet"]),
ReadingInches = Convert.ToInt32(row["ReadingInches"]),
MaterialNumber = row["MaterialNumber"].ToString(),
EnteredBy = row["EnteredBy"].ToString(),
ReadingPounds = Convert.ToDecimal(row["ReadingPounds"]),
MaterialID = Convert.ToInt32(row["MaterialID"]),
Submitted = Convert.ToBoolean(row["Submitted"]),
};
tankReadings.Add(tankReading);
}
return tankReadings.AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)
关键部分是我创建一个List然后使用AsEnumerable()返回它.
在早期版本的C#IEnumerable中定义如下:
public interface IEnumerable<T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
从C#4开始,定义是:
public interface IEnumerable<out T> : IEnumerable
Run Code Online (Sandbox Code Playgroud)
string[] <: object[]C#中的(破坏的数组方差)相同的问题吗?如果我可以隐式地将整数值转换为double,例如:
int a = 4;
double b = a;
// now b holds 4.0
Run Code Online (Sandbox Code Playgroud)
为什么我不能这样做:
int[] intNumbers = {10, 6, 1, 9};
double[] doubleNumbers2 = intNumbers.Cast<double>().ToArray();
Run Code Online (Sandbox Code Playgroud)
我得到"指定的演员表无效" InvalidCastException例外.
相反(从double转换为int)会导致相同的错误.
我究竟做错了什么?
我希望从方法中返回一个有序的项目列表.我的返回类型应该是IEnumerable还是IList?
我不确定ASP.Net的ControlCollection如何工作,所以也许有人可以为我阐明这一点.
我最近发现了扩展方法和Linq的神奇之处.好吧,我很遗憾地发现这不是有效的语法
var c=Controls.Where(x => x.ID=="Some ID").SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
但是从我所知道的,Controls确实实现了IEnumerable提供这种方法的接口,那么是什么给出了?为什么这不起作用?我至少找到了一个体面的解决这个问题的工作:
var list = (IEnumerable<Control>)Controls;
var this_item = list.Where(x => x.ID == "Some ID").SingleOrDefault();
Run Code Online (Sandbox Code Playgroud) 我们正在实现一些EF数据存储库,我们有一些查询包括 TOP 1
我已经阅读了许多建议使用.Take(1)
我正在审查的代码使用的帖子.First()
我知道这两个都会为对象赋值产生相同的结果,但它们是否实际上都解析为同一个查询?查询数据库时,它实际上是否同时TOP 1用于两个请求?或者他们会将查询完整地执行到可枚举中,然后只需获取集合中的第一个条目?
此外,如果我们使用.FirstOrDefault()那么为什么我们应该期待任何不同的行为?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这是实际上只更改查询包括TOP 1话,我应该会完全没有功能上的差异之间.First()和.FirstOrDefault()....对不对?
或者,是否有比这些Enumerable扩展更好的方法来执行查询TOP 1?
Unity可以自动解决IEnumerable<T>吗?
假设我有一个带有这个构造函数的类:
public CoalescingParserSelector(IEnumerable<IParserBuilder> parserBuilders)
Run Code Online (Sandbox Code Playgroud)
我在容器中配置单个IParserBuilder实例:
container.RegisterType<IParserSelector, CoalescingParserSelector>();
container.RegisterType<IParserBuilder, HelpParserBuilder>();
container.RegisterType<IParserBuilder, SomeOtherParserBuilder>();
Run Code Online (Sandbox Code Playgroud)
我可以在不必实现自定义实现的情况下完成这项工作IEnumerable<IParserBuilder>吗?
var selector = container.Resolve<IParserSelector>();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我还没有以任何简单的方式表达这一点,但我仍然在提升Unity,所以我可能错过了一些东西.
我正在使用新的Resharper版本6.在我的代码中的几个地方它强调了一些文本,并警告我可能有一个可能的多个IEnumerable枚举.
我理解这意味着什么,并在适当的时候采纳了建议,但在某些情况下,我不确定这实际上是一个大问题.
如下面的代码所示:
var properties = Context.ObjectStateManager.GetObjectStateEntry(this).GetModifiedProperties();
if (properties.Contains("Property1") || properties.Contains("Property2") || properties.Contains("Property3")) {
...
}
Run Code Online (Sandbox Code Playgroud)
它强调properties了第二行的每一个提及,警告我多次枚举这个IEnumerable.
如果我添加.ToList()到第1行的末尾(properties从a IEnumerable<string>转到a List<string>),警告就会消失.
但可以肯定的是,如果我将它转换为List,那么它将枚举整个IEnumerable以首先构建List,然后根据需要枚举List以查找属性(即1个完整枚举和3个部分枚举) ).而在我的原始代码中,它只执行3个部分枚举.
我错了吗?这里最好的方法是什么?
或者,如果T的枚举器只是列出所有元素,那么使用向量是否安全?
ienumerable ×10
c# ×9
linq ×3
asp.net ×1
c++ ×1
casting ×1
collections ×1
covariance ×1
datatable ×1
generics ×1
optimization ×1
resharper ×1
sql ×1