2011-02-04 36 views
0

我有一個表格,我正在網格中顯示。如果同一行中的另一個值符合某些條件,我會被要求屏蔽某個列的值。如何在使用LINQ的對象列表中掩蓋成員變量的值?

舉個例子:

public class Container 
{ 
    public string Name { get; set; } 
    public int Volume { get; set; } 
} 

IQueryable<Container> myContainerList; 
// Imagine some code to populate the object 

目前,我遮蔽量區域,像這樣:

var filteredList = from container in myContainerList 
        let vol = container.Name.ToUpper().Contains("SPECIAL") ? 
                 -1 : container.Volume 
        select new Container() 
        { 
         Name = Name, 
         Volume = vol 
        }; 

這種成功掩蓋名爲任何容器的體積「特殊」,在它,但這對我來說似乎沒有效率。

有沒有更好的方法去做這件事?

+0

在數據綁定之前獲得應用程序服務器上的集合後,您可以移動屏蔽部分 – 2011-02-04 18:47:24

回答

4

我另一個屬性添加到容器類:

public string MaskedVol 
{ 
    get 
    { 
    return (Name.IndexOf("SPECIAL", StringComparison.OrdinalIgnoreCase) != -1) ? "--" : Volume.ToString(); 
    } 
} 
+0

良好的解決方案可能會阻止可能不必要的「組件」實例創建。 – 2011-02-04 19:13:34

+0

爲了更清晰起見,我會將比較改爲`> = 0`並將順序返回給`?體積:-1`。注意,在原始代碼中`Volume`不是一個字符串,它是一個數字。 – 2011-02-04 19:37:46

1

我同意肖恩,添加一個只讀屬性,可能是最好的選擇。如果你不想改變Container類,比你可以簡化您的LINQ查詢一點點:

var filteredList = myContainerList.Select(c => new Container { 
    Name = c.Name, 
    Volume = c.Name.ToUpper().Contains("SPECIAL") ? -1 : c.Volume 
}); 
1

爲什麼這個問題似乎沒有效率的嗎?
對於每個項目,只執行一次檢查,所以我看不到任何加快此過程的方式。

通過使用IndexOf而不是使用ToUpper創建新字符串並調用Contains,可以使其更快更省資源。然後決定是否Component負責掩蓋Volume
如果是在聲明它一個特殊的屬性,在查詢中刪除雜波:

public class Container 
{ 
    public string Name { get; set; } 
    public int Volume { get; set; } 

    public int MaskedVolume { 
     get { 
      return (Name.IndexOf ("SPECIAL", StringComparison.OrdinalIgnoreCase) >= 0) 
       ? Volume 
       : -1; 
     } 
    } 
} 

如果不是Container有責任瞭解掩蔽,我同意Elian這拉姆達是一個比let更適合:

var filteredList = list.Select (c => 
    new Container { 
     Name = c.Name, 
     Volume = (c.Name.IndexOf ("SPECIAL", StringComparison.OrdinalIgnoreCase) >= 0) 
        ? c.Volume 
        : -1 
    }); 

什麼提醒我,雖然,是您創建的Component另一個實例只是爲了在列表視圖中顯示它的事實。這是真的?看起來好像Component是業務邏輯的一部分,當然從業務邏輯的角度來看,每次填充列表視圖時都不會創建新的Component

也許你應該在這種情況下重新考慮你的解決方案。你能否給我們提供關於Component在應用程序中的更多細節?

相關問題