标签: ienumerable

C#:如何使IEnumerable <T>线程安全?

说我有这个简单的方法:

public IEnumerable<uint> GetNumbers()
{
    uint n = 0;
    while(n < 100)
        yield return n++;
}
Run Code Online (Sandbox Code Playgroud)

你会如何使这个线程安全?而且我的意思是你会得到一次枚举器,并且有多个线程处理所有数字而没有任何人得到重复.

我想在某个地方需要使用一个锁,但是哪个锁必须使迭代器块成为线程安全的呢?一般来说,如果你想要一个线程安全,你需要记住IEnumerable<T>什么?或者更确切地说,我猜这将是一个线程安全IEnumerator<T>...?

c# ienumerable thread-safety

40
推荐指数
1
解决办法
9859
查看次数

将DataTable转换为IEnumerable <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# datatable ienumerable

40
推荐指数
2
解决办法
11万
查看次数

为什么IEnumerable <T>在C#4中变得协变?

在早期版本的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)
  • 只是让LINQ表达式中令人讨厌的强制转换消失了吗?
  • 这不会引入与string[] <: object[]C#中的(破坏的数组方差)相同的问题吗?
  • 从兼容性的角度来看,如何完成协方差的增加?早期代码是否仍适用于更高版本的.NET,或者是否需要重新编译?反过来呢?
  • 以前使用此接口的代码在所有情况下都是严格不变的,或者某些用例现在可能会有不同的行为吗?

c# generics ienumerable language-design covariance

40
推荐指数
3
解决办法
5560
查看次数

为什么Enumerable.Cast会引发InvalidCastException?

如果我可以隐式地将整数值转换为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)会导致相同的错误.

我究竟做错了什么?

c# ienumerable casting

39
推荐指数
2
解决办法
2万
查看次数

我应该返回IEnumerable还是IList?

我希望从方法中返回一个有序的项目列表.我的返回类型应该是IEnumerable还是IList?

c# collections ienumerable

38
推荐指数
4
解决办法
8027
查看次数

为什么Controls集合不提供所有IEnumerable方法?

我不确定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)

c# linq asp.net ienumerable extension-methods

38
推荐指数
3
解决办法
1万
查看次数

使用Entity Framework,最好使用.First()或.Take(1)作为"TOP 1"吗?

我们正在实现一些EF数据存储库,我们有一些查询包括 TOP 1

我已经阅读了许多建议使用.Take(1)
我正在审查的代码使用的帖子.First()

我知道这两个都会为对象赋值产生相同的结果,但它们是否实际上都解析为同一个查询?查询数据库时,它实际上是否同时TOP 1用于两个请求?或者他们会将查询完整地执行到可枚举中,然后只需获取集合中的第一个条目?

此外,如果我们使用.FirstOrDefault()那么为什么我们应该期待任何不同的行为?我知道,当使用一个IEnumerable,调用一个.First()在一个空的集合会抛出,但如果这实际上只更改查询包括TOP 1话,我应该会完全没有功能上的差异之间.First().FirstOrDefault()....对不对?

或者,是否有比这些Enumerable扩展更好的方法来执行查询TOP 1

sql linq ienumerable linq-to-objects entity-framework

38
推荐指数
2
解决办法
3万
查看次数

用Unity解析IEnumerable <T>

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,所以我可能错过了一些东西.

c# ienumerable dependency-injection unity-container

37
推荐指数
5
解决办法
2万
查看次数

Resharper:可能多次枚举IEnumerable

我正在使用新的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个部分枚举.

我错了吗?这里最好的方法是什么?

c# linq resharper optimization ienumerable

37
推荐指数
2
解决办法
2万
查看次数

在C#中是否存在IEnumerable <T>的标准C++等价物?

或者,如果T的枚举器只是列出所有元素,那么使用向量是否安全?

c# c++ ienumerable

37
推荐指数
4
解决办法
2万
查看次数