小编Pau*_*els的帖子

返回导致错误的通用IList

我有以下结构:

public class MyBaseClass : IGeneralClass
{
}

public class MyClass : MyBaseClass 
{
    ...
}

public class MyDataClass
{
    private List<MyClass> _data = null;  

    public void PopulateData()
    {
        ...
    }

    public IList<IGeneralClass> Data
    {
        get 
        {
            return (IList<IGeneralClass>)_data;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我的印象是我可以在.Net4.5中做这个因为逆转,但是当我尝试时,我得到一个运行时错误,如下所示:

Unable to cast object of type 'System.Collections.Generic.List`1[MyClass]' to type 'System.Collections.Generic.IList`1[IGeneralClass]'.
Run Code Online (Sandbox Code Playgroud)

我错误地投了这个,还是不支持?

c# ilist contravariance .net-4.5

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

在C#中使用DirectoryInfo

如果有更有效的方法来执行以下操作:

DirectoryInfo di = new DirectoryInfo(@"c:\");
newFileName = Path.Combine(di.FullName, "MyFile.Txt");
Run Code Online (Sandbox Code Playgroud)

我意识到它只有两行代码,但考虑到我已经有了这个目录,感觉我应该能够做到这样的事情:

newFileName = di.Combine(“MyFile.txt”);
Run Code Online (Sandbox Code Playgroud)

编辑:

应该更清楚 - 我已经有了另一条道路,所以:

DirectoryInfo di = MyFuncReturnsDir();
newFileName = Path.Combine(di.FullName, "MyFile.Txt");
Run Code Online (Sandbox Code Playgroud)

c# directoryinfo text-files

0
推荐指数
1
解决办法
944
查看次数

C#将字符串数组转换为数据集

我有一个字符串数组,需要将它们转换为数据集.有没有一些快捷方式来做到这一点?例如:

string[] results = GetResults();    
DataSet myDataSet = new DataSet();

results = myDataSet.ToDataSet();  // Convert array to data set
Run Code Online (Sandbox Code Playgroud)

我对格式化或结构不太感兴趣.

c# arrays dataset

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

C#使用Enumerable.Range()

我用这个是正确的方式吗?据我了解,以下检查应该是错误的:

 int myVal = 37;
 if (Enumerable.Range(0, 10).Contains(myVal))
    // Do something
 else if (Enumerable.Range(11, 33).Contains(myVal))
    // Do somethiong else
Run Code Online (Sandbox Code Playgroud)

但我似乎得到了一些//Do somethiong else执行的案例.我不能用Enumerable.Range这种方式吗?

c# enumerable

0
推荐指数
2
解决办法
3967
查看次数

Lambda表达式为MINUS两个字符串数组

我正在尝试在两个字符串数组上执行SQL MINUS的等效操作.这是我试图复制的代码:

        string returnValue = "";
        foreach (string eachWord in allWords)
        {
            foreach (string ignoreWord in ignoreWords)
            {
                if (eachWord != ignoreWord)
                {
                    returnValue += eachWord;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

我想把它重写为:

returnValue = allWords.Minus(ignoreWords);
Run Code Online (Sandbox Code Playgroud)

或者同样简洁的东西.我意识到在幕后我最终会得到相同的代码,但我只是在迂腐!

c# lambda

0
推荐指数
1
解决办法
608
查看次数

使用异步任务调用同步WCF服务

我有一个由服务客户端调用的WCF服务.我想使用async/await构造来包装对此的调用; 但是,服务和服务客户​​端是.NET3.5.我对此的解决方案如下:

private async Task<ObservableCollection<MyEntity>> LoadData(ParamData param)
{
        ServiceClient svc = new ServiceClient();
        int results = 0;

        // Set-up parameters
        myParams = BuildParams(param);

        // Call a count function to see how much data we're talking about
        // This call should be relatively quick
        var counter = Task.Factory.StartNew(() =>
        {
            results = svc.GetResultCount(myParams);
        }).ContinueWith((task) =>
        {
            if (results <= 10000 ||
                (MessageBox.Show("More than 10000 results, still retrieve data?"), MessageBoxButton.YesNo) == MessageBoxResult .Yes))
            {
                return svc.Search(myParams);
            }
        });
}
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

Since 'System.Action<System.Threading.Tasks.Task>' …
Run Code Online (Sandbox Code Playgroud)

c# wcf asynchronous async-await .net-4.5

0
推荐指数
1
解决办法
5882
查看次数

使用异步BCL和异步功能

我将此标记为.NET 4,因为我正在使用异步BCL.

我有以下代码:

using System.Threading.Tasks;

public static async Task<ObservableCollection<MyResult>> GetMyData(Params p)
{
    DoStuffClass stuff = new DoStuffClass();
    ObservableCollection<MyResults> results = null;

    await Task.Factory.StartNew(() =>
    {
        results = stuff.LongDrawnOutProcess(p);
    });

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

我从先前版本重构的内容看起来像这样:

static void GetMyDataAsync(Params p, EventHandler<MyArgs> callback)
{
    DoStuffClass stuff = new DoStuffClass();
    stuff.LoadCompleted += callback;
    stuff.LongDrawOutProcessAsync(p)
}
Run Code Online (Sandbox Code Playgroud)

灵感来自于此.

到目前为止,第一种情况的使用是最简单的,这就是我重构的原因; 我的问题是:这种方法有什么缺陷吗?在LongDrawnOutProcess不访问数据库.

.net c# .net-4.0 async-await

0
推荐指数
1
解决办法
75
查看次数

C# WPF 如何在文本框中仅使用数值

我使用了一个 WPF 应用程序,我只想在文本框中允许数字。在 WindowsForm 应用程序中,我会知道我必须如何制作它。
不幸的是,WPF 中没有 KeyPress,并且“代码”也不再起作用。

它是如何正确的,事件是什么?


在这里您可以看到在 Windows 窗体中工作的旧代码:

private void tbKreisdurchmesser_KeyPress(object sender, KeyEventArgs e)
{
    if (char.IsNumber(e.Key) || e.KeyChar==".")
    {

    }
    else
    {
        e.Handled = e.KeyChar != (char)Keys.Back;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# wpf events numeric

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