我最近遇到了一个场景,我需要检查一个IEnumerable<T>
是否以一些IEnumerable<T>
前缀开头。我搜索并没有找到一个现有的StackOverflow答案,所以我决定在下面的答案中提供我自己的解决方案。如何在.NET中检查IEnumerable <T>是否以另一个IEnumerable <T>开头?
2
A
回答
1
这是一种LINQ风格的扩展方法,我通过允许您传入自定义相等比较器来灵活地实现我的实现:例如,如果您希望new[] { "SOME", "IMPORTANT", "WORDS" }.StartsWith(new[] { "some", "important" })
为真,则可以在prefix
参数后面添加StringComparer.OrdinalIgnoreCase
。
public static bool StartsWith<T>(this IEnumerable<T> source, IEnumerable<T> prefix, IEqualityComparer<T> comparer = null)
{
if (source == null)
{
throw new ArgumentNullException(nameof(source));
}
if (prefix == null)
{
throw new ArgumentNullException(nameof(prefix));
}
comparer = comparer ?? EqualityComparer<T>.Default;
using (var sourceEnumerator = source.GetEnumerator())
using (var prefixEnumerator = prefix.GetEnumerator())
{
while (true)
{
if (!sourceEnumerator.MoveNext())
{
return !prefixEnumerator.MoveNext();
}
if (!prefixEnumerator.MoveNext())
{
return true;
}
if (!comparer.Equals(sourceEnumerator.Current, prefixEnumerator.Current))
{
return false;
}
}
}
}
6
你的扩展是好的,但你可以使用已有的Enumerable.Zip
+ All
:
var longerSeq = new[] { "SOME", "IMPORTANT", "WORDS" };
var shorterSeq = new[] { "some", "important" };
bool startsWithCaseInsensitive = longerSeq
.Zip(shorterSeq, (l, s) => string.Equals(l, s, StringComparison.OrdinalIgnoreCase))
.All(b => b); // are all bools true? Returns false on first false
的方法合并第一序列的每个元素与元素 在第二个序列中具有相同的索引。 如果序列不 没有相同数量的元素,方法合并序列 直到它到达其中一个结束
由于Zip
使用延迟执行它不会评估所有,如果第一已产生了false
。
+1
虽然这不等同于OP解决方案。如果“前缀”序列长于“源”序列,'StartsWith'应该返回'false'。哪个'Zip'实现无法区分。 –
0
bool result = longerList.Take(shorterList.Count).SequenceEqual(shorterList);
你也可以添加比较方法SequenceEqual:
bool result = longerList.Take(shorterList.Count).SequenceEqual(shorterList, new MyComparer<string>);
相关问题
- 1. 如何将IEnumerable <IEnumerable <IGrouping <int,string> >>转换为IEnumerable <IEnumerable <string>>
- 2. 如何将IEnumerable <IEnumerable <T>>转换为IEnumerable <T>
- 3. 如何将IEnumerable <IEnumerable <Foo>>减少到IEnumerable <Foo>?
- 4. 检查一个IEnumerable是否包含另一个IEnumerable的所有元素
- 5. .NET反思:检测的IEnumerable <T>
- 6. 分组IEnumerable <IEnumerable <int>>
- 7. 从IEnumerable <IEnumerable <T>>
- 8. 铸造IEnumerable <Derived> IEnumerable <BaseClass>
- 9. IEnumerable <IEnumerable <T>> to string [] []
- 10. “转动”一个IEnumerable <IEnumerable <T>> 90度
- 11. 如何检查IEnumerable是否是List?
- 12. .NET检查两个IEnumerable的<T>有相同的元素
- 13. 我如何拆分一个IEnumerable <String>到IEnumerable的组<string>
- 14. 是否可以写一个递归的IEnumerable <T>
- 15. 如何将List <IEnumerable <ProductViewModel >>转换为<IEnumerable <ProductViewModel >>?
- 16. 如何从IEnumerable <MyClass>告诉IEnumerable <int>?
- 17. 转换一个IEnumerable <组<TParent,年掳>>到IEnumerable <TParent>
- 18. 检查的IEnumerable <T>与反思
- 19. IEnumerable的<IEnumerable的<T>>到的IEnumerable <T>使用LINQ
- 20. 何时使用IEnumerable over IEnumerable <>
- 21. 选择一个IEnumerable <Class>到一个新的IEnumerable <Class2>
- 22. 如何从IEnumerable <DirectoryInfo>
- 23. 如何检查类型是IEnumerable <BaseType>?
- 24. C#什么是映射/转换IEnumerable的<Told>到另一个IEnumerable的<Tnew>尤其是EF
- 25. 的EntitySet <IEnumerable的<T>>到IEnumerable的<T>
- 26. IEnumerable的<T>到的IDictionary <U,IEnumerable的<T>>
- 27. 选择自IEnumerable <T>到IEnumerable的<Quantity<T>>
- 28. 如何通过IEnumerable <T>查看
- 29. ROWLEX是否本机支持IEnumerable <>?
- 30. System.Xml.Linq.XDocument类是否实现IEnumerable <T>?
请不要使用StackOverflow的您的个人博客。提出一个问题,但不要像这样一次提出问题并回答问题。 – Enigmativity
@Enigmativity我不认为回答我自己的问题有什么问题。这是我遇到的一个真正的问题,其他人也可能遇到。我将与世界其他地方分享我的知识,以便其他开发人员可以快速Google并找到解决方案,而不是浪费时间编写自己的实现。 –
我记得当时看到它被人折磨的地方,但我现在找不到那个参考。那么快乐的日子。去吧。 – Enigmativity