Dictionary<int,int>我Individual班上有一個。
public class Individual
{
Dictionary<int,int> pattern = new Dictionary<int,int>();
}
我想在<int,Individual>我的population字典中添加一對:
Dictionary<int,Individual> population = new Dictionary<int, Individual>();
當且僅當Individual字典中沒有其他具有類似pattern變數的變數。
我目前的方法是天真地迭代pattern中Individual已經存在的每個population,但我相信使用不同的方法可以更快地完成。
public bool same_dict(Dictionary<int, int> p1, Dictionary<int, int> p2)
//Meant to compare patterns
{
if (p1.Count != p1.Count) return false;
foreach (var feature in p1)
{
if (p2.ContainsKey(feature.Key))
{
if (feature.Value != p2[feature.Key]) return false;
}
else return false;
}
return true;
}
public bool matched is_duplicated(Individual ind, Dictionary<int, Individual> pop)
{
//Meant to compare Individuals
foreach (var ind2 in pop)
{
if (same_dict(ind.pattern, ind2.Value.pattern))
{
return true;
}
}
return false;
}
我必須使用字典的intsas 鍵,population因為我使用它來將Individual物件與程式的其他部分鏈接起來。一個pattern字典可以包含關鍵的任意量:值對,這就是為什么我核實,如果他們的.Count屬性是一樣的。
uj5u.com熱心網友回復:
我不確定我是否正確理解了您的問題,但是...
當且僅當字典中沒有其他個人具有相似的模式變數
“類似的模式變數”的意思,因為我認為,有兩個Individual具有Pattern字典,相同的密鑰(S)和它的值(一個或多個)(不知道,有多少“模式”,它可以存盤)。
所以我嘗試使用 LINQ 的.Any()擴展方法來檢查字典中anyIndividual的字典是否具有與 added 相同的鍵和值。聽起來很復雜,所以這里是代碼示例(控制臺):PatternpopulationIndividual
public class Individual
{
public Dictionary<int, int> Pattern { get; set; } = new Dictionary<int, int>();
}
static void Main()
{
var population = new Dictionary<int, Individual>();
var key = 0;
for (; key < 5; key ) // Fill population with some Individuals
{
var individual = new Individual();
individual.Pattern.Add(key 1, key 2);
population.Add(key, individual);
}
// Print current population:
Console.WriteLine("Population Dictionary:");
foreach (var kvp in population)
Console.WriteLine(kvp.Key ": "
string.Join(" | ", kvp.Value.Pattern.Select(pattern => pattern.Key "," pattern.Value)));
// Creating new Individuals, which we will try to add to population
var newIndividual1 = new Individual();
newIndividual1.Pattern.Add(5, 6);
var newIndividual2 = new Individual();
newIndividual2.Pattern.Add(5, 5);
var newIndividual3 = new Individual();
newIndividual3.Pattern.Add(8, 9);
Console.WriteLine();
Console.WriteLine("Adding new Individuals:");
if (AddIndividual(population, key, newIndividual1))
key ;
if (AddIndividual(population, key, newIndividual2))
key ;
if (AddIndividual(population, key, newIndividual3))
key ;
Console.ReadKey();
}
static bool AddIndividual(Dictionary<int, Individual> population, int newKey, Individual newIndividual)
{
// Compare each Individual in population with newIndividual
if (!population.Any(p => newIndividual.Pattern.Keys.Any(k => p.Value.Pattern.ContainsKey(k)) &&
newIndividual.Pattern.Values.Any(v => p.Value.Pattern.ContainsValue(v))))
{
population.Add(newKey, newIndividual);
Console.WriteLine("Individual with pattern "
string.Join(" | ", newIndividual.Pattern.Select(pattern => pattern.Key "," pattern.Value))
" successfully added to Population Dictionary.");
return true;
}
else
{
Console.WriteLine("Individual with pattern "
string.Join(" | ", newIndividual.Pattern.Select(pattern => pattern.Key "," pattern.Value))
" already exists in Population Dictionary.");
return false;
}
}
輸出樣本:

編輯。
您可以使用以下.Any方法替換按方法比較鍵和值.SequenceEqual:
if (!population.Any(p => p.Value.Pattern.OrderBy(kvp => kvp.Key).SequenceEqual(newIndividual.Pattern.OrderBy(kvp => kvp.Key))))
{
population.Add(newKey, newIndividual);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/350560.html
