小编Con*_*ell的帖子

IEnumerable <char> to string

我以前从来没有偶然发现过这个问题,但我现在已经感到惊讶,因为我找不到一个非常简单的方法来转换IEnumerable<char>为a string.

我能想到的最好的方法是string str = new string(myEnumerable.ToArray());,但是,对我来说,似乎这会创造一个新的char[],然后string从中创造一个新的,这看起来很昂贵.

我认为这将是.NET框架内置的常用功能.有更简单的方法吗?

对于那些感兴趣的人,我想使用它的原因是使用LINQ来过滤字符串:

string allowedString = new string(inputString.Where(c => allowedChars.Contains(c)).ToArray());
Run Code Online (Sandbox Code Playgroud)

.net c# string ienumerable

136
推荐指数
6
解决办法
7万
查看次数

LINQ - 查询语法与方法链和lambda

当选择在其中一个LINQ扩展方法中使用LINQ查询语法或Lambda表达式时,是否有人遵守任何规则(或者您是否被迫遵守雇主的任何规则?)?这适用于任何实体,SQL,对象,任何东西.

在我们的工作场所,我的老板根本不喜欢lambda,他会使用查询语法来处理任何事情,在某些情况下,我发现它的可读性较差.

var names = collection.Select(item => item.Name);

var names = from item in collection
            select item.Name;
Run Code Online (Sandbox Code Playgroud)

也许在添加一个条件时,我发现的Lambda有点乱,在哪里

var names = collection.Where(item => item.Name == "Fred")
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name == "Fred"
            select item.Name;
Run Code Online (Sandbox Code Playgroud)

只是出于兴趣:编译器如何处理这个?有谁知道上面的LINQ查询将如何编译成lambda?是否会Name为每个元素调用该属性?我们可以这样做,并可能提高性能吗?这是否意味着lambda在性能方面稍微可控?

var names = collection.Select(item => item.Name)
                      .Where(name => name == "Fred");
Run Code Online (Sandbox Code Playgroud)

当然,当我们开始使用越来越多的表达式时,lambda变得混乱,我开始在这里使用查询语法.

var names = collection.Where(item => item.Name == "Fred")
                      .OrderBy(item => item.Age)
                      .Select(item => item.Name);

var names = from item in collection
            where item.Name …
Run Code Online (Sandbox Code Playgroud)

.net c# linq lambda linq-query-syntax

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

C#async/await在Task <>对象上的Progress事件

我完全不熟悉C#5的新async/ await关键字,我对实现进度事件的最佳方式感兴趣.

现在我更喜欢它,如果一个Progress事件Task<>本身.我知道我可以把事件放在包含异步方法的类中,并在事件处理程序中传递某种状态对象,但对我而言,这似乎更像是一种解决方法而不是解决方案.我可能还想要不同的任务来触发不同对象中的事件处理程序,这听起来很混乱.

有没有办法可以做类似以下的事情?:

var task = scanner.PerformScanAsync();
task.ProgressUpdate += scanner_ProgressUpdate;
return await task;
Run Code Online (Sandbox Code Playgroud)

c# async-await

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

IDictionary <,>逆转?

我在外部类中有以下方法

public static void DoStuffWithAnimals(IDictionary<string, Animal> animals)
Run Code Online (Sandbox Code Playgroud)

在我的调用代码中,我已经有了一个Dictionary<string, Lion>对象,但我无法将此作为此方法的参数传递.那么a IDictionary<,>不是逆变的吗?我看不出为什么这不起作用的任何理由.

我能想到的唯一解决方案是:

var animals = new Dictionary<string, Animal>();

foreach(var kvp in lions) {
    animals.Add(kvp.Key, kvp.Value);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将此字典传递给此方法,而无需创建相同对象的新字典?


编辑:

因为这是我的方法,我知道我在字典中使用的唯一成员是getter TValue this[TKey key],它是一个成员IDictionary<TKey, TValue>,所以在这种情况下,我无法使用'更宽'类型的参数.

.net c#

17
推荐指数
2
解决办法
2464
查看次数

为什么ReSharper告诉我"User.Identity == null"总是假的?

我的一个ASP.NET MVC Controller类中有一个简单的属性.

在此输入图像描述

我以前见过很多次,所以要明白这个消息的含义,但通常它是完全合理的.但是,这不是.要获得带下划线的语句,User必须为null,因此检查User.Identity是正常的.

Identity属性是IPrincipal接口的一部分,并返回一个继承的对象IIdentity.

要继承此接口或任何接口,此属性必须是引用类型,因此可能为null,对吧?

那么为什么我心爱的ReSharper呻吟?

c# asp.net-mvc resharper

16
推荐指数
1
解决办法
795
查看次数

为什么ArgumentNullException和ArgumentException的构造函数中的参数是相反的?

在设计软件时,我总是喜欢一致性,除非有一个非常好的理由不一致.

在.NET Framework中,我们有ArgumentNullExceptionArgumentOutOfRangeException,它们都来自ArgumentException.所有这三个都有一个构造函数,它接受两个字符串参数 - 一个用于paramName,一个用于异常message.

为什么两个派生类都反转了参数顺序?!

public ArgumentNullException(String paramName, String message)
    : base(message, paramName) { }

public ArgumentOutOfRangeException(String paramName, String message)
    : base(message, paramName) { }
Run Code Online (Sandbox Code Playgroud)

这意味着在我的调用代码中,它看起来像这样:

public string DoSomething(string name, int age)
{
    if (name == null)
        throw new ArgumentNullException("name", "Name cannot be null.");

    if (name == string.Empty)
        throw new ArgumentException("Name cannot be an empty string.", "name");

    if (age < 18)
        throw new ArgumentOutOfRangeException("age", "Age must be …
Run Code Online (Sandbox Code Playgroud)

.net c#

16
推荐指数
1
解决办法
1547
查看次数

有没有理由拥有一个没有吸气剂的房产?

我的经理问我,使用带有二传手的房产是否是一个好习惯,但没有吸气剂.

public class PropertyWrapper
{   
    private MyClass _field;

    public MyClass Property
    {
        set { _field = value; } 
    }

    public string FirstProperty
    {
        get { return _field.FirstProperty; } 
    }

    public string SecondProperty
    {
        get { return _field.SecondProperty; } 
    }
}
Run Code Online (Sandbox Code Playgroud)

他将使用其他属性来公开由此setter设置的私有字段的属性.

我的建议是只使用一个私有字段并在构造函数中设置它,在这种情况下工作正常.如果我需要首先构建一个构造对象(甚至可能使用多态),我仍然会更喜欢一个Load方法,而不是一个getter-less属性.

但我很感兴趣.我们都非常关注最佳实践,并尝试确保我们的代码是标准化的.有没有人有关于无吸气剂属性的官方文章?或者更好 - 在.NET Framework本身中这种用法的一个例子?

c# properties

15
推荐指数
2
解决办法
5280
查看次数

将构造函数(或函数)添加到枚举

我不确定构造函数是否正是我正在寻找的但如果我解释我想要做什么,希望有人可以告诉我,如果我想做的是一个愚蠢的想法或是否有办法做到这一点.

所以我有一个枚举:

public enum MessageType
{
    Normal, 
    Error, 
    Chat, 
    Groupchat, 
    Headline
}
Run Code Online (Sandbox Code Playgroud)

这个枚举基本上是jabber.net的包装器MessageType.所以我想从中创建我的枚举.所以目前我有这样的功能:

private MessageType ConvertMessageType(JabberMessageType jabberType)
{
    MessageType type = MessageType.Error;

    switch (jabberType)
    {
        case JabberMessageType.normal:
            type = MessageType.Normal;
            break;

        //etc
    }

    return type;
}
Run Code Online (Sandbox Code Playgroud)

所以我必须使用 enum MessageType type = ConvertMessageType(JabberMessageType.groupchat);

我想要的是能够做到这样的事情:

enum MessageType type = MessageType(JabberMessageType.groupchat);
// or 
enum MessageType type = MessageType.FromJabberJid(JabberMessageType.groupchat);
Run Code Online (Sandbox Code Playgroud)

因此,转换属于枚举而不是外部的方法.

c# enums

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

我的表单加载时可以冻结我的UI渲染吗?

有什么办法可以暂停Winforms中的所有UI Update命令吗?

或者我有一种轻微的感觉,我试图以完全错误的方式解决这个问题,所以我的问题是另一种解决方法:我基本上加载一个控件的保存状态,它会在其上加载新的控件.但是我在UI线程中执行了一些操作,并且从另一个线程加载了一些数据,然后填充了UI.

因此,加载时的效果是用户可以看到一些控件出现在一个位置,然后移动到窗体上的另一个位置,更改值等.

我想要一个加载屏幕而不是这个并在后台加载控件.这是一个相当大的应用程序,它并不重要,所以重新设计我的代码并不是一个真正的选择.

我可以在方法执行时简单地停止控件上的所有Update()命令吗?

c# winforms

11
推荐指数
1
解决办法
8925
查看次数

在实现命令行标志时,我应该使用fowardslash(/)或连字符( - )作为前缀吗?

当从命令行读取参数/标志时,是否使用正斜杠(/)或连字符( - )的任何约定(无论是书面的还是通常理解的)?

C:\> myprogram.exe -a
C:\> myprogram.exe /a
Run Code Online (Sandbox Code Playgroud)

根据我的经验,这两个似乎是可以互换的,但是我没有使用足够的命令行工具来说我发现了任何规则或模式.

他们中的任何一个都被使用了吗?如果我愿意,理论上我可以使用星号(*)吗?

c# command-line console-application command-line-arguments

11
推荐指数
4
解决办法
3464
查看次数