C# 从ICollection中获取一定数量的元素

C# 从ICollection中获取一定数量的元素,c#,C#,在不知道集合类型的情况下,如何从中获取大量元素 伪代码 System.Collections.ICollection collection = new[] { 8, 9, 10, 12 }; collection = collection.Take(2); /* collection == new[] { 8, 9 }; */ 通常情况下,当您必须先对可枚举的值进行Cast()时,您就可以这样做了。Linq(Take())仅适用于泛型类型: System.Collectio

在不知道集合类型的情况下,如何从中获取大量元素

伪代码

System.Collections.ICollection collection = new[] { 8, 9, 10, 12 };

collection = collection.Take(2);

/* collection == new[] { 8, 9 }; */
通常情况下,当您必须先对可枚举的值进行
Cast()
时,您就可以这样做了。Linq(
Take()
)仅适用于泛型类型:

        System.Collections.ICollection collection = new[] { 8, 9, 10, 12 };

        collection = collection.Cast<int>().Take(2).ToList();

        /* collection == new[] { 8, 9 }; */
System.Collections.ICollection collection=new[]{8,9,10,12};
collection=collection.Cast().Take(2.ToList();
/*集合==新[]{8,9}*/

只需添加一种不同的方法

System.Collections.ICollection collection = new[] { 8, 9, 10, 12 };
var _collection = collection as IEnumerable<int>;
var result = _collection.Take(3);
System.Collections.ICollection collection=new[]{8,9,10,12};
var_collection=作为IEnumerable的集合;
var result=_collection.Take(3);

System.Collections.ICollection collection=new[]{8,9,10,12};
var enumerator=collection.GetEnumerator();
整数计数=0;
while(enunmerator.MoveNext()&&count<3)
{
Console.WriteLine(enumerator.Current);
计数++;
}

您可以创建自己的非泛型扩展方法

public static class ExtensionMethods
{
    public static IEnumerable Take(this IEnumerable @this, int take)
    {

        var enumerator = @this.GetEnumerator();
        try
        {
            for (int i = 0; i < take && enumerator.MoveNext(); i++)
            {
                yield return enumerator.Current;
            }
        }
        finally
        {
            var disposable = enumerator as IDisposable;
            if(disposable != null)
                disposable.Dispose();
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        System.Collections.ICollection collection = new[] { 8, 9, 10, 12 };

        var result = collection.Take(2);
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();

    }
}
公共静态类扩展方法
{
公共静态IEnumerable Take(this IEnumerable@this,int Take)
{
var枚举器=@this.GetEnumerator();
尝试
{
for(int i=0;i
或者,最好首先使用
ICollection
(不清楚是否有充分的理由不回答这个问题)。我的目标是了解类型。使用
.Cast().Take(2)
?如果知道您的集合只包含
int
值,那么
Cast()
是安全的。如果您的集合还包含其他类型,并且您只对
int
值感兴趣(即对
int
值进行筛选),则使用
OfType()
而不是是,
Cast()
不会失败,无论集合中的对象类型是什么
collection=collection.Take(2)
不会编译,因为
Take
返回一个
IEnumerable
,即使它是
IEnumerable
而不是
IEnumerable
,您仍然无法重新分配它。
ICollection
继承自
IEnumerable
,但不是
IEnumerable
。您的强制转换仅因您知道已指定的特定值而有效,而不适用于任何给定的
ICollection
(即使它恰好只有整数)。@Servy同意,感谢您的反馈,已编辑。此操作已结束,但IEnumerable无法指定给ICollection。@Roydukey您在问题中说明了这一点“您通常可以在枚举时使用System.Linq.Take执行此操作”,但事实并非如此,您无法将
Take
的输出分配给
ICollection
,您只能将其分配给
IEnumerable
。我认为这一事实意味着您的“psudocode”示例“不关心重新分配部分,只关心查询部分。如果确实要与
IEnumerable
进行比较,则您的
collection
应该是
System.Collections.IEnumerable
而不是
System.Collections.ICollection
,以便进行比较。
public static class ExtensionMethods
{
    public static IEnumerable Take(this IEnumerable @this, int take)
    {

        var enumerator = @this.GetEnumerator();
        try
        {
            for (int i = 0; i < take && enumerator.MoveNext(); i++)
            {
                yield return enumerator.Current;
            }
        }
        finally
        {
            var disposable = enumerator as IDisposable;
            if(disposable != null)
                disposable.Dispose();
        }
    }
}

class Program
{
    public static void Main(string[] args)
    {
        System.Collections.ICollection collection = new[] { 8, 9, 10, 12 };

        var result = collection.Take(2);
        foreach (var item in result)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();

    }
}