【发布时间】:2020-07-13 07:53:51
【问题描述】:
一段时间以来一直在努力清除此编译器错误。
编译器错误:第 29 行 - 'List newCollection = tempCollection.Where(谓词);'
CS1929 'List' 不包含 'Where' 的定义和 最佳扩展方法重载 'ParallelEnumerable.Where(ParallelQuery, Func
)' 需要“ParallelQuery”类型的接收器
从代码 sn-p 中可以看出,我试图从 Linq 库中调用扩展方法 Where(),并使用谓词作为输入 arg。我试图调用它的集合是List<T> - 值得注意的是,我试图允许这种新的扩展方法SnapFingers 接受T 类型的任何IEnumerable,我觉得这是我的问题产生于。我知道具体化可能会解决此问题,但我想尝试使其通用化。
代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
namespace BootCamp.Chapter
{
public static class SnapFingersLINQ
{
public static IEnumerable<T> SnapFingers<T>(this IEnumerable<T> items, Predicate<T> predicate = null)
{
if (!items.Any())
{
return default(List<T>);
}
else
{
if (predicate != null)
{
IEnumerable<T> shuffItems = LINQExtensions.Shuffle(items);
List<T> tempCollection = shuffItems.ToList();
List<T> newCollection = tempCollection.Where<T>(predicate);
int numToRemove = AmountToRemove(items);
newCollection.RemoveRange(0, numToRemove);
return tempCollection;
}
else
{
List<T> shuffItems = LINQExtensions.Shuffle(items).ToList();
int numToRemove = AmountToRemove(items);
shuffItems.RemoveRange(0, numToRemove);
return shuffItems;
}
}
}
private static int AmountToRemove<T>(IEnumerable<T> items)
{
int lengthCollection = items.Count();
int numberOfElementsToRemove = lengthCollection / 2;
if (lengthCollection % 2 == 0)
{
return numberOfElementsToRemove;
}
else
{
return numberOfElementsToRemove - 1;
}
}
}
}
请注意,LINQExtensions.Shuffle() 只是返回一个新的洗牌集合,IEnumerable<T>(我知道存在 Linq 扩展“洗牌”,但这是训练营作业的一部分)。
对此的任何帮助将不胜感激!
【问题讨论】:
-
您能否扩展一下,因为我已经进行了一些挖掘,但 MSDN 或其他帖子中的信息似乎对我没有帮助?