我正在编写一个为.NET 4.5,Windows RT和Windows Phone 8设置的可移植类库(PCL)。
我想在Dictionary中找到min值。在网上搜索说MoreLinq是最快的方式。
所以我添加了一个引用,编译得很好。
但我不确定我的PCL是否有“Broken Containment”。
编译器是否会告诉我是否引用了不符合PCL约束的内容?
答案 0 :(得分:4)
不幸的是编译器没有为你做这样的检查。
我尝试使用来自System.Data
命名空间的类来创建.NET 4类库,这显然不是PCL兼容的。我从.NET 4.5,Windows Store和Windows Phone 8的可移植类库项目中引用和使用它没有任何问题。更多:我设法从Windows应用商店应用程序引用这个可移植库,编译并运行它。当然,运行Windows应用程序认证工具包会发现并且验证失败。
提前检测这些问题的最佳方法是通过NuGet添加引用,检查包是否支持您的目标配置文件。当然,这需要NuGet包以极好的方式准备。
对于某些第三方库,此类软件包可能无法使用,但可能仍与PCL兼容。在这种情况下,我建议您下载源代码并尝试自己创建一个具有正确目标的可移植类库。这样,只要编译器只引用系统程序集,编译器就会向您发出有关兼容性问题的警告。
答案 1 :(得分:2)
在MoreLinq的特定情况下,此库很容易转换为可移植类库。
NO_SERIALIZATION_ATTRIBUTES
,NO_EXCEPTION_SERIALIZATION
,NO_HASHSET
,NO_TRACING
。修改 ExceptBy.cs 中的私有方法ExceptByImpl
,以便在为PCL构建时使用Dictionary<,>
而不是HashSet<>
:
private static IEnumerable<TSource> ExceptByImpl<TSource, TKey>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
Func<TSource, TKey> keySelector,
IEqualityComparer<TKey> keyComparer)
{
#if !NO_HASHSET
HashSet<TKey> keys = new HashSet<TKey>(second.Select(keySelector), keyComparer);
foreach (var element in first)
{
TKey key = keySelector(element);
if (keys.Contains(key))
{
continue;
}
yield return element;
keys.Add(key);
}
#else
var keys = second.ToDictionary(keySelector, keyComparer);
foreach (var element in first)
{
TKey key = keySelector(element);
if (keys.ContainsKey(key))
{
continue;
}
yield return element;
keys.Add(key, element);
}
#endif
}
当然,这不是您问题的直接答案,但希望它对您的具体问题有用。