在c#

时间:2016-03-16 12:24:29

标签: c# list collections ienumerator

我必须在c#中编写一个通用集合。我有这门课:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pract_03
{
class Collection<T> : IEnumerable<T>
{
    List<T> list;

    public Collection()
    {
        list = new List<T>();
    }
    public void Add(T item)//add element to collection
    {
        list.Add(item);
    }
    public bool Remove(T item) 
    {
        return list.Remove(item);
    }
    public bool Contains(T item)
    {
        return list.Contains(item);

    }
    public void Clear() 
    {
        list.Clear();

    }
    public int Count()
    {
        return list.Count;
    }
    public void Ordenar(IComparer<T> comparer) 
    {
        list.Sort(comparer);
    }
    public T this[int index]
    {
        get
        {
            return list[index];
        }
    }


// This part was automatically added by visual studio, I'm not sure what it is
    IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable<T>)lista).GetEnumerator();
        }

        public IEnumerator<T> GetEnumerator()
        {
            return ((IEnumerable<T>)lista).GetEnumerator();
        }
    }
}

现在我有2个IEnumerator:&#34; EnumeratorForward&#34;和&#34; EnumeratorBackward&#34;,按照添加项目的顺序在一个或另一个方向上迭代colecction。

这里是其中一个的代码,另一个是类似的:

class EnumeratorForward<T> : IEnumerator<T>
{
    Collection<T> col;
    int index;

    public EnumeratorForward(Collection<T> collection)
    {
        col = collection;
        index = -1;

    }
    public T Current
    {
        get
        {
            return col[index];
        }
    }

    object IEnumerator.Current
    {
        get
        {
            return col[index];
        }
    }

    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public bool MoveNext()
    {
        index++;
        if (index >= col.Count()) return false;
        else return true;
    }

    public void Reset()
    {
        index=-1;
    }
}

我甚至不知道这种实施是否正确。如果我没有错,c#中的IEnumerators就像java中的Iterators。

我有两个普查员。现在我的问题是,我还需要两个枚举器按顺序迭代集合。总之,如果我有清单[2,3,5,1,4]

enumeratorForward将会这样做 - &gt; 2,3,5,1,4

enumeratorBackward - &gt; 4,1,5,3,2

enumeratorGreater - &gt; 1,2,3,4,5

enumeratorLess - &gt; 5,4,3,2,1

问题是,如果我订购Collection的列表,我就会丢失添加项目的顺序。

我不知道如何实现它。

1 个答案:

答案 0 :(得分:0)

胡安,听听你说的话:

enumeratorForward will do -> 2,3,5,1,4
enumeratorBackward -> 4,1,5,3,2
enumeratorGreater -> 1,2,3,4,5
enumeratorLess -> 5,4,3,2,1

The problem is if I order the list of Collection I lose the order the items were added.

你已经按照某种顺序添加了数字。但这些数字可能会比这些更大或更小。 3小于5,但可能在5之前添加了3。肯定。

但是你想如何通过 他们的体重和添加顺序订购?让我们看一下:

2,5,3,13,4,5,6,3,4,3

所以..'2'是第一个,当然。但是在输出中,我们应该有'5'还是'3'..? 5更早发生,但3是下一个高于2 ..

你必须说哪个得分/等级/ whatyoucallit更重要。例如,您可以说:按重量对它们进行排序,如果有些相等,则按添加顺序对它们进行排序。但这对数字来说有点无稽之谈。如果3等于3,那么它是3和3,并且它与3和3相同,即使你挥手它仍然是3和3。

2,(3,3,3),(4,4),(5,5),6,13
   \ | /   \ /   \ /
    which one is which one from the input?
      who cares, it's still 3, 4 and 5.

当开始有意义时 - 你的元素比数字更复杂 - 你的排序 - 相等不是一个更大的等同的

IE中。我们假设你定义第一个等级是“偶数数字”,然后是“添加顺序”

 (2,4,6,4),  (5,3,13,5,3,3)
  \     /     \          /
 all even       all odd
  x%2==0         x%2==1
then in-order   then in-order of appearance

在上面的示例中,它们按%2值(0或1)排序,然后按源列表中的出现顺序排序。现在它有一定道理。另一个例子是对“Person”对象列表进行排序。您可以按FamilyName对它们进行排序,但是当它们相等时,再按FirstName对它们进行排序,再次相等时,保留外观顺序(因此来自西班牙的MarySue将出现在德国的MarySue之前,如输入列表中所示)。

即便如此,请注意我如何一直指定排序:按FOO排序然后等于BAR然后按(...)然后按(...)

你根本不能同时按2个或更多等级排序。其中一些必须比其他一些更重要,只有当较高重要性的职级称“项目相等”时,才必须使用较低重要性的职级。

如果你想实现一些智能迭代器,它们会根据某些排名标准对列表进行重新排序,你需要的东西非常类似于:
- 在实际排序或迭代发生之前指定所有标准的方法
- 收集这些标准并将其传递给排序算法的方法
- 执行多标准排序的方法 - 让用户迭代结果的方法

所以,至少,你需要几种方法来说明会发生什么:
- GetEnumerator_ByOddEven
- GetEnumerator_ByOddEven_ThenAppearance
- GetEnumerator_ByOddEven_ThenGreater_ThenAppearance
等,或:
- GetEnumerator(condition1,condition2,condition3,...)
一次通过所有..

您可以在LINQ .OrderBy(Desc)和.ThenBy(Desc)方法中看到另一种解决方案:
- .OrderBy返回一个“OrderedEnumerable”,它知道第一级排序是什么,并根据它进行迭代。 --.ThenBy返回一个“OrderedEnumerable”(一个新的!),现在知道对于每个相等的那个,应该有另一轮的分类
- 调用更多.ThenBys再次返回一个“OrderedEnumerable”(一个新的!),现在知道有3,4,5,6 ......级别的排序