我正在使用以下代碼來獲取輸入對象列表的所有組合,同時限制組合的大小(maxComboCount)。雖然代碼雖然提出了問題,但速度很慢。有人可以請看一看,並建議可以幫助演出的任何變化。提高以下組合算法的性能
例如, 輸入:
List<int> input = new List<int>() {obj1, obj2, obj3};
int maxComboCount = 2;
輸出:
[OBJ1],[OBJ2],[OBJ3],
[OBJ1,OBJ1],[OBJ1,OBJ2],[OBJ1 ,OBJ3],
[OBJ2,OBJ1],[OBJ2,OBJ2],[OBJ2,OBJ3],
[OBJ3,OBJ1],[OBJ3,OBJ2],[OBJ3,OB J3]
public static IEnumerable<List<T>> GetCombo<T>(List<T> listObject, int maxComboCount)
{
var resultList = new List<List<T>>();
var distinctObjects = listObject.Distinct().ToList();
for (int j = 0; j < distinctObjects.Count(); j++)
{
var objPosition = distinctObjects[j];
var newList = new List<T>();
newList.Add(objPosition);
if (newList.Count() <= maxComboCount)
{
resultList.Add(newList);
}
var listMinusOneObject = listObject.Select(x => x).ToList();
listMinusOneObject.Remove(listMinusOneObject.Where(x => Compare(x, objPosition)).First());
//Compare method returns true if the objects are equal
if (listMinusOneObject.Any())
{
GetAllCombinationsOfAllSizes(listMinusOneObject, newList, ref resultList, maxComboCount);
}
}
return resultList;
}
public static void GetAllCombinationsOfAllSizes<T>(List<T> listObject, List<T> growingList, ref List<List<T>> returnResult, int maxComboCount)
{
var distinctObjects = listObject.Distinct().ToList();
for (int j = 0; j < distinctObjects.Count(); j++)
{
var objPosition = distinctObjects[j];
var newList = growingList.ToList();
newList.Add(objPosition);
if (newList.Count() <= maxComboCount)
{
returnResult.Add(newList);
}
var listMinusOneObject = listObject.Select(x => x).ToList();
listMinusOneObject.Remove(listMinusOneObject.Where(x => Compare(x, objPosition)).First());
if (listMinusOneObject.Any())
{
GetAllCombinationsOfAllSizes(listMinusOneObject, newList, ref returnResult, maxComboCount);
}
}
}
編輯
這是我的類重寫Equals和GetHashCode的
public class Material
{
public int Price { get; set; }
public string Name { get; set; }
public int Num1 { get; set; }
public int Num2 { get; set; }
public int Num3 { get; set; }
public bool isInStock { get; set; }
public override bool Equals(object obj)
{
Material material = obj as Material;
return material != null &&
material.Price == this.Price &&
material.Name == this.Name &&
material.Num1 == this.Num1 &&
material.Num2 == this.Num2 &&
material.Num3 == this.Num3 &&
}
public override int GetHashCode()
{
return this.Price.GetHashCode()^
this.Name.GetHashCode()^
this.Num1.GetHashCode()^
this.Num2.GetHashCode()^
this.Num3.GetHashCode()^
}
}
我投票結束這個問題作爲題外話,因爲它代碼審查SE,而不是堆棧溢出。 – Sefe
我會做的第一件事是將'distinctObjects.Count()'改爲'distinctObjects.Count' –