2011-04-26 64 views
0

我想要做的是收集具有屬性的對象,並傳入對象以充當查詢模板。如何排序或優先考慮其屬性值與同一類型的給定輸入對象最相同的對象?如何判斷列表中的哪些對象與同一類型的另一個對象最相同?

更多細節:

 List<A> myList = new List<A>() {new A() {b="x"}, 
             new A() {c="r"}, 
             new A() {b="x",c="r"},}; 

     var myTemplate = new A() {b = "x", c="r"}; 

我想這個例子相匹配,對第三個項目,但在財產cnull"f"的情況下,它應該返回的第一個和第三個項目。如果財產c"r",但bisnull"f",它應該返回第二個和第三個項目,因爲它們匹配c

+0

我想你會給我們更多的細節,然後纔有可能得到一個像樣的答案。 – StriplingWarrior 2011-04-26 23:23:06

+0

你能給出一個你如何使用這個功能的代碼示例,向我們展示一下什麼需要實現? – David 2011-04-26 23:26:27

回答

1

你基本上必須拿出一個公式來確定這兩個對象有多相似。爲每個屬性選擇一個權重,然後使用簡單的比較來說明該屬性是否應該被視爲相同。可以使用某種類型的模糊匹配,但這會變得更加複雜。

簡單的東西可能是:

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; 
} 

這確切的重量在一個對象略顯不足匹配最高,空值和分歧都沒有。

+0

嗯,我希望有一種方法來散列它,做一些通用的比較... – 2011-04-26 23:40:49

+0

我不認爲哈希將工作;散列意味着獨特(或儘可能接近)識別對象,即使它們具有相似的值。 – 2011-04-26 23:47:50

+0

不會有一個字符串距離算法在比較兩個哈希函數嗎? – 2011-04-26 23:49:53

0

我已經完成了大量數據集的大量模糊匹配,並且有很多場景需要考慮。你似乎正在接近一個簡單的或通用的案例,對於那些沒有大量數據的案例來說,某些通用的字符串距離比較似乎是合適的。

如果表現很重要,我最好的建議是「瞭解你的數據」。按照上面的建議寫自己的評分。

話雖如此,我們使用Levenshtein distance進行模糊字符串匹配。就兩個字符串之間的「距離」而言,它是非常不具體的,因此對於給定的問題它可能適用也可能不適用。這裏是C#中算法的快速複製/粘貼。它非常容易地連接到大多數語言。這會在空輸入中引發異常,因此請務必按照您的要求添加自己的特殊情況處理。

public static int LevenshteinDistance(string s, string t) 
{ 
    var sLen = s.Length; 
    var tLen = t.Length; 

    var d = new int[sLen + 1, tLen + 1]; 

    for (var i = 0; i <= sLen; d[i, 0] = i++) { } 
    for (var j = 0; j <= tLen; d[0, j] = j++) { } 

    for (var i = 1; i <= sLen; i++) 
    { 
     for (var j = 1; j <= tLen; j++) 
     { 
      var cost = (t[j - 1] == s[i - 1]) ? 0 : 1; 
      d[i, j] = Math.Min(
       Math.Min(d[i - 1, j] + 1, // a deletion 
       d[i, j - 1] + 1),   // an insertion 
       d[i - 1, j - 1] + cost); // a substitution 
     } 
    } 

    return d[sLen, tLen]; 
} 
相關問題