2011-11-27 47 views
2

在什麼情況下,我需要調用string.Internstring.IsInternedString價值?關於中的String.intern C#

我有這樣的方法使用網格組行:

// get grouping value for DataGrid 
    string GroupItemAccessor(object value) 
    { 
     COA coa = (COA)value; 
     return string.IsInterned(coa.GroupName); 
    } 

如果我不叫string.Intern結果是錯誤的,這種電網應通過GroupName值組。

String.Intern not used

此如果string.Intern使用(如例如代碼)它的工作作爲我的預期。

String.Intern used

+0

如果你只是'返回coa.GroupName;'會發生什麼? – Oded

+0

結果是圖像#1。 –

+1

你可以發佈你如何設置網格的分組嗎?你用什麼網格控制?這是webforms,winforms還是wpf? – Oded

回答

4

你得到不同的結果的原因是,你是不是上進行分組的字符串值,您是分組的字符串引用。字符串在分組時不被視爲字符串,而是作爲對象處理,因此僅比較引用,而不是內容。

當你從數據庫中讀取的值,每個字符串將是一個單獨的實例,即使它們具有相同的價值。例如前兩個字符串「AAA」將是單獨的對象,而不是對同一對象的引用。

如果你不能在字符串值網格組,使用String.Intern是使琴絃相同情況下的一種方式,這樣的分組作品反正。

但是,您可能需要使用自己的製作琴絃的相同情況的方法,因爲實習的字符串意味着他們將永遠不會被垃圾收集。您可以使用這樣的類:

public class LocalIntern { 

    private Dictionary<string, string> _intern = new Dictionary<string, string>(); 

    public string Intern(string value) { 
    if (_intern.ContainsKey(value)) { 
     return _intern[value]; 
    } else { 
     _intern.Add(value, value); 
     return value; 
    } 
    } 

} 

當您再次填充網格,你只需要創建一個新的LocalIntern對象,並在此前舉行的一個字符串可以被垃圾收集。

1

在猜測,SuperList大概會檢查身份進行分組(參考檢查) - 如果情況確實如此,那不拘留將被視爲即使它們是相同的字符串不同的字符串。

在這種情況下,需要對字符串進行實驗,以便控件正確分組。

+0

感謝您的回放,我會檢查'SuperList'源代碼來確認這一點。 –

1

如果我猜測那麼我會說網格使用參考平等。據我所知,只有文字字符串被實施。

因此,沒有實習coa.GroupName,這是平等的不相等的參考,因此兩組名字不電網似乎區別對待。

+0

感謝您的回放,我會檢查'SuperList'代碼以確認這一點。 –