小编Ste*_*ane的帖子

C#泛型方法中的转换问题

我正在写一个通用方法有些麻烦.它有以下签名;

public static ThingCollection<T> GetThings<T>(...) where T : Thing
Run Code Online (Sandbox Code Playgroud)

有几个班级; 从Thing继承的ThingA,ThingB和ThingC; 我希望能够在方法中使用类似的代码.

var things = new ThingCollection<T>();

if (typeof(T) == typeof(Thing))
  foreach (var item in someCollection)
    things.Add((T)new Thing(...));
else if (typeof(T) == typeof(ThingA))
  foreach (var item in someCollection)
    things.Add((T)new ThingA(...));
else if (typeof(T) == typeof(ThingB))
  foreach (var item in someCollection)
    things.Add((T)new ThingB(...));
else if (typeof(T) == typeof(ThingC))
  foreach (var item in someCollection)
    things.Add((T)new ThingC(...));
else
  throw new Exception("Cannot return things of type " + typeof(T).ToString());

return things;
Run Code Online (Sandbox Code Playgroud)

问题是如果我不转换新对象,我得到一个最好的重载方法匹配有无效的参数错误.如上所示添加T强制转换适用于新的Thing(),但报告 …

c# generics collections methods casting

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

验证正则表达式而不捕获异常?

在.NET应用程序(用C#编写)中,我有一个带有列表的UI和一个用于输入过滤字符串的文本框,用于过滤列表中显示的内容.我按用户键入刷新过滤器.

我现在想允许在过滤字符串中使用正则表达式,这会产生问题.当用户键入表达式时,它可能是无效的,例如在键入开始括号的时间和键入右括号的时间之间.使用无效表达式新建正则表达式会引发异常,我想阻止这种情况.一种方法是捕获异常,但我想知道是否有某种方法可以检查表达式是否是一个有效的正则表达式而不实际尝试使用它来创建一个正则表达式.

.net c# regex

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

与LINQ有些混淆

一些背景信息;

  • LanguageResource是基类
  • LanguageTranslatorResource和LanguageEditorResource继承自LanguageResource
  • LanguageEditorResource定义了一个IsDirty属性
  • LanguageResourceCollection是LanguageResource的集合
  • LanguageResourceCollection在内部保存LanguageResources Dictionary<string, LanguageResource> _dict
  • LanguageResourceCollection.GetEnumerator()返回 _dict.Values.GetEnumerator()

我有一个LanguageResourceCollection _resources只包含LanguageEditorResource对象,并希望使用LINQ来枚举那些脏的,所以我尝试了以下内容.我的具体问题是粗体.

  1. _resources.Where(r => (r as LanguageEditorResource).IsDirty)

    但是,Intellisense没有显示其他LINQ方法,但我仍然对它进行编码,并告诉我"LanguageResourceCollection不包含'Where'的定义,也没有扩展方法......".

    为什么LanguageResourceCollection实现IEnumerable的方式阻止它支持LINQ?

  2. 如果我将查询更改为

    (_resources as IEnumerable<LanguageEditorResource>).Where(r => r.IsDirty)

    Intellisense,则显示LINQ方法和解决方案.但是在运行时我得到一个ArgumentNullException"Value不能为null.参数名称:source".

    这是我的LINQ代码中的问题吗?
    这是一般类设计的问题吗?
    我如何深入了解LINQ生成的内容以尝试查看问题所在?

我对这个问题的目的不是为特定问题找到解决方案,因为我现在必须使用其他(非LINQ)方法解决它,而是尝试提高我对LINQ的理解并学习如何改进设计我的课程与LINQ更好地合作.

.net c# linq linq-to-objects

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

如何在LINQ查询中有条件地加入?

如果我有两张桌子; DriverId和Trips使用外键DriverId和CoDriverId键入的驱动程序,我想查找驱动程序是驱动程序或共同驱动程序的所有行程我可以在Transact-SQL中将其编码为

select d.DriverId, t.TripId 
from Trips t inner join Drivers d 
on t.DriverId = d.DriverId or t.CoDriverId = d.DriverId
Run Code Online (Sandbox Code Playgroud)

如何将其编码为LINQ查询?

linq conditional join

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