C# 如何使用LINQ屏蔽对象列表中成员变量的值?
我有一个表格,我正在网格中显示。如果同一行中的另一个值满足某些条件,我将被要求屏蔽某一列的值 例如:C# 如何使用LINQ屏蔽对象列表中成员变量的值?,c#,.net,linq,C#,.net,Linq,我有一个表格,我正在网格中显示。如果同一行中的另一个值满足某些条件,我将被要求屏蔽某一列的值 例如: public class Container { public string Name { get; set; } public int Volume { get; set; } } IQueryable<Container> myContainerList; // Imagine some code to populate the object 这成功地屏蔽
public class Container
{
public string Name { get; set; }
public int Volume { get; set; }
}
IQueryable<Container> myContainerList;
// Imagine some code to populate the object
这成功地屏蔽了任何名为“special”的容器的卷,但对我来说这似乎效率低下
有更好的方法吗?我想向容器类添加另一个属性:
public string MaskedVol
{
get
{
return (Name.IndexOf("SPECIAL", StringComparison.OrdinalIgnoreCase) != -1 ) ? "--" : Volume.ToString();
}
}
我将向容器类添加另一个属性:
public string MaskedVol
{
get
{
return (Name.IndexOf("SPECIAL", StringComparison.OrdinalIgnoreCase) != -1 ) ? "--" : Volume.ToString();
}
}
我同意Sean的观点,添加只读属性可能是最好的选择。如果不想更改
容器
类,可以稍微简化linq查询:
var filteredList = myContainerList.Select(c => new Container {
Name = c.Name,
Volume = c.Name.ToUpper().Contains("SPECIAL") ? -1 : c.Volume
});
我同意Sean的观点,添加只读属性可能是最好的选择。如果不想更改
容器
类,可以稍微简化linq查询:
var filteredList = myContainerList.Select(c => new Container {
Name = c.Name,
Volume = c.Name.ToUpper().Contains("SPECIAL") ? -1 : c.Volume
});
为什么您觉得这样做效率低下?
对于每个项目,只执行一次检查,因此我看不到任何加快流程的方法 通过使用
IndexOf
而不是使用ToUpper
创建新字符串并调用Contains
,您可以使其速度更快、资源消耗更少
然后决定屏蔽卷是否是组件的责任
如果是,请在其中声明一个特殊属性,以消除查询中的混乱:
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;
}
}
}
如果知道掩蔽不是容器的责任,我同意lambda比let
更适合:
var filteredList = list.Select (c =>
new Container {
Name = c.Name,
Volume = (c.Name.IndexOf ("SPECIAL", StringComparison.OrdinalIgnoreCase) >= 0)
? c.Volume
: -1
});
不过,提醒我的是,您创建了另一个组件的实例,只是为了在列表视图中显示它。这是真的吗?似乎组件
是业务逻辑的一部分,从业务逻辑的角度来看,新的组件
不会在每次填充列表视图时创建
在这种情况下,也许你应该重新考虑你的解决方案。您能否向我们提供有关应用程序中如何使用组件的更多详细信息?为什么您觉得这样做效率低下?
对于每个项目,只执行一次检查,因此我看不到任何加快流程的方法
通过使用IndexOf
而不是使用ToUpper
创建新字符串并调用Contains
,您可以使其速度更快、资源消耗更少
然后决定屏蔽卷是否是组件的责任
如果是,请在其中声明一个特殊属性,以消除查询中的混乱:
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;
}
}
}
如果知道掩蔽不是容器的责任,我同意lambda比let
更适合:
var filteredList = list.Select (c =>
new Container {
Name = c.Name,
Volume = (c.Name.IndexOf ("SPECIAL", StringComparison.OrdinalIgnoreCase) >= 0)
? c.Volume
: -1
});
不过,提醒我的是,您创建了另一个组件的实例,只是为了在列表视图中显示它。这是真的吗?似乎组件
是业务逻辑的一部分,从业务逻辑的角度来看,新的组件
不会在每次填充列表视图时创建
在这种情况下,也许你应该重新考虑你的解决方案。您能否向我们提供有关应用程序中如何使用组件的更多详细信息?您可以在数据绑定之前在应用程序服务器上获取集合之后移动屏蔽部分您可以在数据绑定之前在应用程序服务器上获取集合之后移动屏蔽部分这是一个很好的解决方案,可能会阻止不需要创建组件
实例。为了更清晰,我会将比较更改为=0
,并将顺序返回到?卷:-1
。请注意,在原始代码中,卷不是一个字符串,而是一个数字。您是对的,我返回的是名称,而不是卷。我更新了代码以显示返回的正确内容。这是一个很好的解决方案,可以防止可能不必要地创建组件
实例。为了更清晰,我将比较更改为=0
,并将顺序返回为?卷:-1
。请注意,在原始代码中,卷不是一个字符串,而是一个数字。您是对的,我返回的是名称,而不是卷。我更新了代码以显示返回的正确内容。在您的示例(扩展等)中,我唯一要注意的是,如果这是linq to sql,它可能无法正确转换为sql并引发异常(只是猜测,尚未测试)。除此之外,lambdas肯定比Elian Ebbing所说的“让我们”更具可读性。你说得对,我没想过。当然,如果是LINQtoSQL,我们的扩展方法就不成问题了,感谢您指出这一点!在您的示例(扩展等)中,我唯一要注意的是,如果这是一个linq to sql,它可能无法正确转换为sql并引发异常(只是猜测,尚未测试)。除此之外,lambdas肯定比Elian Ebbing所说的“让我们”更具可读性。你说得对,我没想过。当然,如果是LINQtoSQL,我们的扩展方法就不成问题了,感谢您指出这一点!