所以基本上你在寻找排列。很多事情都可以简化。为了删除重复项,您可以传递
HashSet
List
. 这将消除比较对象的需要,从而加快过程。
这是我不久前使用的以下函数,用于获取
哈希集
length
:
static IEnumerable<IEnumerable<T>> PermutationOfObjects<T>(IEnumerable<T> objects, int length)
{
if (length == 1) return objects.Select(t => new T[] { t });
return PermutationOfObjects(objects, length - 1).SelectMany(t => objects, (t1, t2) => t1.Concat(new T[] { t2 }));
}
哈希集
对于指定的
maxLength
:
static IEnumerable<IEnumerable<T>> AllPermutations<T>(IEnumerable<T>list, int maxLength)
{
IEnumerable<IEnumerable<T>> newList = null;
for (int i = 1; i <= maxLength; i++)
{ if (newList == null) { newList = PermutationOfObjects(list, i); } else newList = newList.Union(PermutationOfObjects(list, i)); }
return newList;
}
HashSet<OBJECT> input = new HashSet<OBJECT>() { obj1, obj2, obj3};
int maxComboCount = 2;
IEnumerable<IEnumerable<OBJECT>> perms = AllPermutations(input, maxComboCount);
以及回报:
[obj1]、[obj2]、[obj3]
[obj1,obj1],[obj1,obj2],[obj1,obj3]
[obj3,obj1],[obj3,obj2],[obj3,obj3]
几个例子:
使用类时
OBJECT
为了让HashSet使用
Equals
和
GetHashCode
作为基于值的相等检查而不是基于引用的相等检查,您需要声明您的类:
public class OBJECT
{
public int ID { get; set; }
public string someString { get; set; }
public override bool Equals(object obj)
{
OBJECT q = obj as OBJECT;
return q != null && q.ID == this.ID && q.someString == this.someString;
}
public override int GetHashCode()
{
return this.ID.GetHashCode() ^ this.someString.GetHashCode();
}
}
在此之后,您的输出不应该有重复项。