在新的异步dotnet 4.5库中是否有办法在Task.WhenAll方法上设置超时.我想获取几个源并在说5秒后停止并跳过未完成的源.
这两种方法似乎对我来说都是一样的
public IEnumerable<string> GetNothing()
{
return Enumerable.Empty<string>();
}
public IEnumerable<string> GetLessThanNothing()
{
yield break;
}
Run Code Online (Sandbox Code Playgroud)
我在测试场景中分析了每一个,我没有看到速度上有意义的差异,但yield break版本稍微快一些.
是否有任何理由使用一个而不是另一个?一个比另一个更容易阅读吗?是否存在对呼叫者有影响的行为差异?
如果我有这样的枚举
public enum Hungry
{
Somewhat,
Very,
CouldEatMySocks
}
Run Code Online (Sandbox Code Playgroud)
和这样的自定义属性
public class HungerAttribute : Attribute
{
public Hungry HungerLevel { get; set; }
public Hungry? NullableHungerLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以做这个
[Hunger(HungerLevel = Hungry.CouldEatMySocks)]
public class Thing1
Run Code Online (Sandbox Code Playgroud)
但我不能这样做
[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]
public class Thing2
Run Code Online (Sandbox Code Playgroud)
它会生成一个错误,指出"'NullableHungerLevel'不是有效的命名属性参数,因为它不是有效的属性参数类型".
为什么不允许这样做?据我所知,从根本上说它不在可接受的类型列表中.有效类型似乎是基元,枚举,字符串,类型和前面类型的一维数组.
这只是一个旧规则,当Nullable出现时没有得到更新?
如何将TextBox绑定到整数?例如,将单位绑定到textBox1.
public partial class Form1 : Form
{
int unit;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
textBox1.DataBindings.Add("Text", unit, "???");
}
Run Code Online (Sandbox Code Playgroud) Java中是否有任何此类代码覆盖工具可以为程序提供不同的路径.基本上,这个想法是确保在执行期间覆盖所有循环和嵌套循环.这是为了能够确定代码库中的所有循环是否至少通过一次迭代执行.
我在两个.NET 4.0的新Tuple <>实例之间使用.Equals和==之间看到了不同的行为.如果我在元组<>中的对象上重写了Equals并在元组上调用.Equals,则将调用Equals的覆盖.如果我在元组上使用==,则不会调用Equals的覆盖.这是设计,是否有意义?
编辑:从答案和评论,我可以告诉我,我不清楚.我知道Tuple <>是一个引用类型,对于引用类型==将检查标识(ReferenceEquals).但是,如果Tuple <>覆盖==来检查它包含的对象是否相等?为了保持一致,可能不是.
例如,如果我有一个简单的对象
public class NameAndNumber
{
public int Number { get; set; }
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is NameAndNumber)
{
NameAndNumber other = (NameAndNumber)obj;
return Number == other.Number && Name == other.Name;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我做这样的事情:
Tuple<NameAndNumber, NameAndNumber> left = new Tuple<NameAndNumber, NameAndNumber>(
new NameAndNumber { Name = "one", Number = 1 },
new NameAndNumber { Name = "two", Number = …Run Code Online (Sandbox Code Playgroud) 我将字节存储在数据库表中.当我用Linq 2 sql检索它时,我得到了返回类型system.data.linq.Binary.
我无法转换system.data.linq.binary为字节数组(byte[]).
我该如何转换它?
///my datacontext
var db = new db();
//key is an value from user
var img = from i in db.images
where i.id == key
select i.data;
Run Code Online (Sandbox Code Playgroud)
该i.data是linq.binary我希望它是byte[].
我试过(byte[])img但它没有用.
我有一组具有一组属性的类如下所示.
class ContactInfo
{
[ReadOnly(true)]
[Category("Contact Info")]
public string Mobile { get; set; }
[Category("Contact Info")]
public string Name{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
此类的对象被分配给属性网格,以便用户可以更新现有联系人.你可以看到Mobile被标记为ReadOnly.
但是,当我想添加一个全新的联系人时,我希望用户能够编辑联系人移动设备.为此,我需要在将对象分配给属性网格之前从Type中动态删除Readonly属性.可能吗?
我有一个类Bar包含一个List<Foo>,既Foo和Bar实施了ISerializable.
反序列化a时Bar,List<Foo>最初填充(正确数量)nulls; 然后在退出Bar反序列化时,Foo调用每个反序列化的ctor,填充List<Foo>(正确反序列化)Foos.
为什么会这样?我无法在测试项目中复制它:无论我尝试过什么导致Foo反序列化的ctors 在ctor 之前被调用Bar.这实际上是我想要的行为,因为我需要填充列表以便为反序列化做一些初始化Bar!
任何人都知道什么可能导致Foos被反序列化这么晚?谢谢!
之前我没有使用过很多lambda表达式,我遇到了一个案例,我认为我可以使用一个.我有一个约19,000条记录的自定义列表,我需要查看列表中是否存在记录,因此不是编写一堆循环或使用linq来查看列表,我决定尝试这样做:
for (int i = MinX; i <= MaxX; ++i)
{
tempY = MinY;
while (tempY <= MaxY)
{
bool exists = myList.Exists(item => item.XCoord == i && item.YCoord == tempY);
++tempY;
}
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是执行需要大约9到11秒.我做错了什么,这只是我不应该使用这样的表达式的情况?
谢谢.
编辑:抱歉.我应该详细说明.我正在创建一个带有for和while循环的记录列表,并检查myList中是否存在该记录.这是我能想到的唯一方法.我会重新评估它,看看我带来了什么.
c# ×7
.net ×2
.net-4.0 ×1
async-await ×1
async-ctp ×1
attributes ×1
c#-4.0 ×1
data-binding ×1
java ×1
lambda ×1
linq ×1
linq-to-sql ×1
list ×1
nullable ×1
propertygrid ×1
tuples ×1
winforms ×1