我必须在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的列表,我就会丢失添加项目的顺序。
我不知道如何实现它。
答案 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 ......级别的排序