我有以下结构:
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)
我错误地投了这个,还是不支持?
如果有更有效的方法来执行以下操作:
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) 我有一个字符串数组,需要将它们转换为数据集.有没有一些快捷方式来做到这一点?例如:
string[] results = GetResults();
DataSet myDataSet = new DataSet();
results = myDataSet.ToDataSet(); // Convert array to data set
Run Code Online (Sandbox Code Playgroud)
我对格式化或结构不太感兴趣.
我用这个是正确的方式吗?据我了解,以下检查应该是错误的:
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
这种方式吗?
我正在尝试在两个字符串数组上执行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)
或者同样简洁的东西.我意识到在幕后我最终会得到相同的代码,但我只是在迂腐!
我有一个由服务客户端调用的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) 我将此标记为.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
不访问数据库.
我使用了一个 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# ×8
.net-4.5 ×2
async-await ×2
.net ×1
.net-4.0 ×1
arrays ×1
asynchronous ×1
dataset ×1
enumerable ×1
events ×1
ilist ×1
lambda ×1
numeric ×1
text-files ×1
wcf ×1
wpf ×1