【发布时间】:2012-05-31 13:40:45
【问题描述】:
我很难找到一种有效但简单的方法来检查一个列表是否包含另一个列表(保留顺序)。它类似于 string.Contains(string) 功能。
假设我有四个整数集合:
A = [1, 2, 3, 4, 5]
B = [2, 3]
C = [5, 6, 7]
D = [3, 2, 4]
A.Contains(B) 为真,而A.Contains(C) 和A.Contains(D) 为假。
如果有帮助的话,我宁愿不使用迭代器,但我无法想象一种有效的方法;以下代码效率极低。
public static bool IsSequentiallyEqual<T>(this IEnumerable<T> lhs, IEnumerable<T> rhs)
{
return lhs.Zip(rhs, (a, b) => a.Equals(b)).All(isEqual => isEqual == true);
}
public static bool StartsWith<T>(this IEnumerable<T> haystack, IEnumerable<T> needle)
{
return haystack.Take(needle.Count()).IsSequentiallyEqual(needle);
}
public static bool Contains<T>(this IEnumerable<T> haystack, IEnumerable<T> needle)
{
var result = list.SkipWhile((ele, index) => haystack.Skip(index).StartsWith(needle));
return result.Count() >= needle.Count();
}
【问题讨论】:
-
您将拥有多少件商品? (也就是说,效率是关键,还是你只是想要一些不是很低效的东西?)
-
只需要效率是不够的,但会很好
-
有没有办法通过 LINQ 干净地实现这些?
-
干净利落的意思是“没有用所需的逻辑把源代码弄得乱七八糟?”