假设出于调试目的,我希望快速将IEnumerable的内容转换为单行字符串,每个字符串项以逗号分隔.我可以使用foreach循环在辅助方法中完成它,但这既不好玩也不简短.可以使用Linq吗?其他一些短途的方式?
如果我有一个IEnumerable像:
string[] items = new string[] { "a", "b", "c", "d" };
Run Code Online (Sandbox Code Playgroud)
我想循环通过所有连续项目(大小为2的滑动窗口).这将是
("a","b"), ("b", "c"), ("c", "d")
Run Code Online (Sandbox Code Playgroud)
我的解决方案就是这样
public static IEnumerable<Pair<T, T>> Pairs(IEnumerable<T> enumerable) {
IEnumerator<T> e = enumerable.GetEnumerator(); e.MoveNext();
T current = e.Current;
while ( e.MoveNext() ) {
T next = e.Current;
yield return new Pair<T, T>(current, next);
current = next;
}
}
// used like this :
foreach (Pair<String,String> pair in IterTools<String>.Pairs(items)) {
System.Out.PrintLine("{0}, {1}", pair.First, pair.Second)
}
Run Code Online (Sandbox Code Playgroud)
当我编写这段代码时,我想知道.NET框架中是否已经存在执行相同操作的函数,并且它不仅适用于对,而且适用于任何大小的元组.恕我直言应该有一个很好的方法来做这种滑动窗口操作.
我使用C#2.0,我可以想象使用C#3.0(w/LINQ)有更多(更好)的方法来做到这一点,但我主要对C#2.0解决方案感兴趣.不过,我也很欣赏C#3.0解决方案.
任何人都可以告诉我何时应该使用它们.
例如,我想当我想访问集合的.Count或单个项目时,我应该使用IList,对吗?
谢谢.
IEnumerable和之间有什么区别IEnumerable<T>?
我已经看到很多框架类实现了这两个接口,因此我想知道通过实现它们可以获得哪些优势?
请看看他们是如何定义的:
public interface IEnumerable
{
[DispId(-4)]
IEnumerator GetEnumerator();
}
public interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,IEnumerable<T>源于IEnumerable,这意味着无论IEnumerable有什么,IEnumerable<T>继承,那么为什么我们实现两者而不仅仅是IEnumerable<T>?实施IEnumerable<T>还不够吗?
同样,还有其他类似的对:
IList 和 IList<T> ICollection 和 ICollection<T>我也想知道这些.
方法返回一个序列,IEnumerable<T>您现在想要检查它是否为空.你怎么建议这样做?我正在寻找良好的可读性和良好的性能.
第一种也是最明显的方法是检查计数是否大于零:
if(sequence.Count() == 0)
Run Code Online (Sandbox Code Playgroud)
具有良好的可读性,但性能可怕,因为它必须实际完成整个序列.
我有时使用的方法如下:
if(!sequence.Any())
Run Code Online (Sandbox Code Playgroud)
这并不是(据我所知)必须经历整个序列,但可读性有点倒退和尴尬.(读好了很多,如果我们检查的顺序是不是空的,虽然).
另一种选择是First在try-catch中使用,如下所示:
try
{
sequence.First();
}
catch(InvalidOperationException)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
不是一个非常漂亮的解决方案,也可能更慢,因为它使用异常和东西.FirstOrDefault当然可以通过使用来防止这种情况,但如果序列中的第一项实际上是默认值,则会出现大问题;)
那么,检查序列是否为空的任何其他方法?你经常使用哪一个?你建议使用哪一种?
注意:为了获得最佳的可读性,我可能会将上述一个片段放在IsEmpty扩展方法中,但我仍然很好奇,因为我必须在该方法中做一些事情:p
我有一个popuplated IEnumerable<User>集合.
我想从中删除一个项目,我该怎么做?
foreach(var u in users)
{
if(u.userId = 1123)
{
// remove!
}
}
Run Code Online (Sandbox Code Playgroud)
我知道你不应该在循环时删除,所以我不介意创建新集合或删除它.
但我不知道如何删除一个项目,因为某种原因丢失了!
或者我也很困惑,如何创建一个新的集合,如:
IEnumerable<User> modifiedUsers = new List<User>();
foreach(var u in users)
{
if(u.userId != 1233)
{
modifiedUsers.add ??????
}
}
Run Code Online (Sandbox Code Playgroud)
如何添加到集合中?
我知道在大多数情况下它可能无关紧要/影响性能,但我讨厌IEnumerable做到和做的想法.Count().是否有一个IsEmpty或NotEmpty或一些功能?(类似于stl empty())
任何人都可以帮助我(非通用接口)的Count扩展方法IEnumerable.
我知道LINQ不支持它但是如何手动编写它?
我有2个IEnumerable集合.
IEnumerable<MyClass> objectsToExcept
Run Code Online (Sandbox Code Playgroud)
和
IEnumerable<MyClass> allObjects.
Run Code Online (Sandbox Code Playgroud)
objectsToExcept可能包含来自的对象allObjects.
我需要从中删除allObjects对象objectsToExcept.例如:
foreach (var myClass in objectsToExcept)
{
allObjects.Remove(myClass);
}
Run Code Online (Sandbox Code Playgroud)
要么
allObject.Except(objectsToExcept)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.方法执行后的计数表示没有删除任何项目.
ienumerable ×10
c# ×9
linq ×5
.net ×4
generics ×2
ilist ×2
collections ×1
icollection ×1
iterator ×1
string ×1