我能想到的最简单的方法是使用一点 Linq。首先,将所有学生对作为字符串对列表,类似于您显示的内容。AList<Tuple<string, string>>
应该工作。棘手的一点是您使用的是矩形数组,如果您将其视为 IEnumerable,它会有一些奇怪的访问行为。
然后,您需要一种方法来比较两对是否相等。我有一个通用类,允许您指定用于比较的 lambda 语句,因此您不必为每个自定义比较实现单一用途的 IEqualityComparer:
public class GenericEqualityComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> equalityComparer;
private readonly Func<T, int> hashFunc;
public GenericEqualityComparer(Func<T, T, bool> compareFunc, Func<T,int> hashFunc)
:this(compareFunc)
{
this.equalityComparer = compareFunc;
this.hashFunc = hashFunc;
}
public GenericEqualityComparer(Func<T, T, bool> compareFunc)
{
this.equalityComparer = compareFunc;
this.hashFunc = o => o.GetHashCode();
}
public bool Equals(T x, T y)
{
return equalityComparer(x, y);
}
public int GetHashCode(T obj)
{
return hashFunc(obj);
}
}
然后,您只需通过 Linq 的 GroupBy() 方法运行值列表,指定 GenericEqualityComparer 以自定义顺序无关的方式比较值:
var pairCounts = pairList
.GroupBy(p=>p, //key selector; we want the Tuple itself
new GenericEqualityComparer<Tuple<string,string>>(
(a,b)=>(a.Item1 == b.Item1 && a.Item2 == b.Item2)
|| (a.Item1 == b.Item2 && a.Item2 == b.Item1))
.Select(g=>new Tuple<string, int>(g.Key.Item1 + " - " + g.Key.Item2,
g.Count());
最终结果将是List<Tuple<string,int>>
包含找到的每对名称的第一个排列,以及在列表中找到该对的任意排列的数量。