是否有一种常见的方法将单个类型的项传递给T
需要IEnumerable<T>
参数的方法 ?语言是C#,框架版本2.0.
目前我正在使用一个辅助方法(它是.Net 2.0,所以我有一大堆类似于LINQ的转换/投射辅助方法),但这看起来很愚蠢:
public static class IEnumerableExt
{
// usage: IEnumerableExt.FromSingleItem(someObject);
public static IEnumerable<T> FromSingleItem<T>(T item)
{
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
其他方式当然是创建和填充a List<T>
或an Array
而不是传递它IEnumerable<T>
.
[编辑]作为扩展方法,它可能被命名为:
public static class IEnumerableExt
{
// usage: someObject.SingleItemAsEnumerable();
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
[Edit2]我们发现someObject.Yield()
(正如@Peter在下面的评论中所建议的那样)是这个扩展方法的最佳名称,主要是为了简洁,所以如果有人想要抓住它的话,它会与XML注释一起:
public static class IEnumerableExt
{
/// <summary>
/// Wraps this object instance into an IEnumerable<T>
/// consisting of a …
Run Code Online (Sandbox Code Playgroud) 在C#中,我可以将字符串值转换为字符串文字,我会在代码中看到它吗?我想用它们的转义序列替换制表符,换行符等.
如果这段代码:
Console.WriteLine(someString);
Run Code Online (Sandbox Code Playgroud)
生产:
Hello
World!
Run Code Online (Sandbox Code Playgroud)
我想要这个代码:
Console.WriteLine(ToLiteral(someString));
Run Code Online (Sandbox Code Playgroud)
生产:
\tHello\r\n\tWorld!\r\n
Run Code Online (Sandbox Code Playgroud) 有没有人stackalloc
在C#编程时实际使用过?我知道它的作用是什么,但它出现在我的代码中的唯一一次是偶然的,因为Intellisense在我开始输入时建议它static
,例如.
虽然它与使用场景无关,但stackalloc
我实际上在我的应用程序中做了大量的遗留互操作,因此我偶尔会使用unsafe
代码.但是,我通常会找到unsafe
完全避免的方法.
而且由于.Net中单个线程的堆栈大小约为1Mb(如果我错了,请纠正我),我使用时更加保留stackalloc
.
是否有一些实际案例可以说:"这对我来说是不正确的数据和处理不安全和使用stackalloc
"?
昨天我发现了Christoph Nahr的一篇题为".NET Struct Performance"的文章,该文章 对几种语言(C++,C#,Java,JavaScript)进行了基准测试,为一种增加两个点结构(double
元组)的方法.
事实证明,C++版本需要大约1000ms来执行(1e9次迭代),而C#在同一台机器上不能低于~3000ms(并且在x64中表现更差).
为了自己测试,我采用了C#代码(并略微简化为仅调用参数通过值传递的方法),并在i7-3610QM机器(3.1Ghz boost for single core),8GB RAM,Win8上运行. 1,使用.NET 4.5.2,RELEASE构建32位(x86 WoW64,因为我的操作系统是64位).这是简化版本:
public static class CSharpTest
{
private const int ITERATIONS = 1000000000;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static Point AddByVal(Point a, Point b)
{
return new Point(a.X + b.Y, a.Y + b.X);
}
public static void Main()
{
Point a = new Point(1, 1), b = new Point(1, 1);
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < ITERATIONS; i++) …
Run Code Online (Sandbox Code Playgroud) 阅读本文后,我决定仔细研究一下我使用Dapper的方式.
我在一个空数据库上运行此代码
var members = new List<Member>();
for (int i = 0; i < 50000; i++)
{
members.Add(new Member()
{
Username = i.toString(),
IsActive = true
});
}
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
花了大约20秒钟.这是2500插入/秒.不错,但考虑到博客达到45k插入/秒,也不是很好.在Dapper中有更有效的方法吗?
另外,作为旁注,通过Visual Studio调试器运行此代码需要3分钟!我认为调试器会慢一点,但我很惊讶地看到了这么多.
UPDATE
所以这
using (var scope = new TransactionScope())
{
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
还有这个
connection.Execute(@"
insert Member(Username, IsActive)
values(@Username, @IsActive)", members);
Run Code Online (Sandbox Code Playgroud)
都花了20秒.
但这需要4秒!
SqlTransaction …
Run Code Online (Sandbox Code Playgroud) 这是我的方法,它给了我错误.
public List<Project> GetProjectForCombo()
{
using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
{
var query = from pro in db.Projects
select new { pro.ProjectName, pro.ProjectId };
return query.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我改变它:
public List<Project> GetProjectForCombo()
{
using (MyDataContext db = new MyDataContext (DBHelper.GetConnectionString()))
{
var query = from pro in db.Projects
select pro;
return query.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
然后它工作正常没有错误.
能告诉我,我怎样才能返回ProjectId和ProjectName.
谢谢.
这有效:
short value;
value = 10 > 4 ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这有效:
short value;
value = "test" == "test" ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这不起作用:
short value;
string str = "test";
value = "test" == str ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
这也不是:
short value;
string str = "test";
value = "test".Equals(str) ? 5 : 10;
Run Code Online (Sandbox Code Playgroud)
最后两种情况我收到以下错误:
Cannot implicitly convert type 'int' to 'short'.
An explicit conversion exists (are you missing a cast?)
Run Code Online (Sandbox Code Playgroud)
为什么我必须对最后两个案例进行演绎而不是对前两个案例进行演绎?
我正在寻找有关通过端口80从远程GPRS设备发送/接收数据的最佳方法的建议.
在随机端口上创建普通TCP套接字工作正常,但许多运营商只允许端口80 HTTP流量通过其代理,然后期望HTTP ascii数据(他们可以根据需要修改标头).
那么,我的设备是否应该在持久的http连接上创建POST请求,然后从Web服务接收base64编码的响应?我不确定涉及二进制数据时移动代理的行为如何.有推荐的方法吗?
我可以调整设备的固件和服务器端应用程序.
[编辑]
我想知道是否有标准(或多或少)的方式来做到这一点.对于各种数据记录和工业系统,需要通过套接字连接发送大量二进制数据.对于以太网连接,通常只有适应某些防火墙的问题,但是持久的二进制连接在任意端口上建立都没有问题.
但是,移动ISP倾向于仅限制端口80的"数据计划".他们也可以随意使用HTTP标头,也可能是HTML数据本身.这是我需要识别潜在陷阱和规避它们的方法.
有没有办法使用CSS自动对齐使用字母间距的单词,每个单词在其行中,到定义的宽度?
例如,"像这样的东西"看起来像这样:
是否有一种非突兀的方式将这种样式应用到我的文本中?我相信纯CSS没有这个选项(至少在3之前没有CSS版本,CSS3似乎有一个text-justify
属性,但它还没有得到很好的支持),所以js解决方案也没问题.
关于这个问题有几个类似的问题,我还没有找到足够的理由来决定走哪条路.
真正的问题是,是否合理使用存储库模式抽象NHibernate的,或者不是?
似乎抽象它背后的唯一原因是如果需要的话,让自己选择用不同的ORM替换NHibernate.但是创建存储库和抽象查询看起来像添加另一层,并手工完成大部分管道工作.
一种选择是使用IQueryable<T>
商业层公开和使用LINQ,但根据我的经验,LINQ支持仍然没有在NHibernate中完全实现(查询根本不能按预期工作,我讨厌花时间调试框架).
尽管在我的业务层中引用NHibernate会伤害我的眼睛,但它本身应该是数据访问的抽象,对吧?
你对此有何看法?
c# ×6
.net ×3
performance ×2
benchmarking ×1
binary-data ×1
cil ×1
css ×1
dapper ×1
escaping ×1
generics ×1
http ×1
ienumerable ×1
justify ×1
keyword ×1
linq ×1
nhibernate ×1
proxy ×1
sqlbulkcopy ×1
stackalloc ×1
string ×1
text-justify ×1