你基本上必須拿出一個公式來確定這兩個對象有多相似。爲每個屬性選擇一個權重,然後使用簡單的比較來說明該屬性是否應該被視爲相同。可以使用某種類型的模糊匹配,但這會變得更加複雜。
簡單的東西可能是:
public byte Similarity(SomeType other)
{
byte similarity = 0;
if (this.Property1 == other.Property1)
similarity += 25;
if (this.Property2 == other.Property2)
similarity += 13;
if (this.Property3 == other.Property3)
similarity += 12;
if (SomeFuzzyComparisonReturnsVerySimilar(this.Property4, other.Property4))
similarity += 50;
return similarity;
}
也就是說,我限定返回從0到100的數的簡單方法; 100是相同的,0是完全不同的。
一旦你有了這些,選擇足夠相似的項目是一件相當簡單的事情,你可以考慮;例如:
var similarObjects = ListOfSomeTypes.Where(s => s.Similarity(templateObject) > 75);
或者對它們進行排序:
var sortedBySimilarity = ListOfSomeTypes.OrderByDescending(s => s.Similarity(templateObject));
雖然最終我的觀點是,你必須要拿出自己的「共同具有最有」的定義,一旦你有剩下的可能會很容易。這並不意味着這一定很容易。
隨着你的問題的更多細節,一個可能的公式是:
public byte Similarity(A other)
{
byte similarity = 0;
if (this.b == null | other.b == null)
similarity += 25;
else if (this.b == other.b)
similarity += 50;
if (this.c == null | other.c == null)
similarity += 25;
else if (this.c == other.c)
similarity += 50;
return similarity;
}
這確切的重量在一個對象略顯不足匹配最高,空值和分歧都沒有。
我想你會給我們更多的細節,然後纔有可能得到一個像樣的答案。 – StriplingWarrior 2011-04-26 23:23:06
你能給出一個你如何使用這個功能的代碼示例,向我們展示一下什麼需要實現? – David 2011-04-26 23:26:27