C# 林克能帮我做这个吗?
Linq的新功能,非常激动。但是,我想看看是否可以使用LINQ执行以下操作:C# 林克能帮我做这个吗?,c#,.net,vb.net,linq,C#,.net,Vb.net,Linq,Linq的新功能,非常激动。但是,我想看看是否可以使用LINQ执行以下操作: DataView source = (DataView) MyDataGrid.ItemsSource; foreach (DataRowView vw in source) { if (vw.Row[dummyColumnIndex] != null && vw.Row[dummyColumnIndex].ToString() == DisplayValue)
DataView source = (DataView) MyDataGrid.ItemsSource;
foreach (DataRowView vw in source)
{
if (vw.Row[dummyColumnIndex] != null &&
vw.Row[dummyColumnIndex].ToString() == DisplayValue)
{
vw.Row[dummyColumnIndex] = string.Empty;
break;
}
}
注意,我的foreach循环中有一个中断,这意味着我只需要将第一个匹配行的列值重置为空字符串
谢谢 var firstMatch=source
var firstMatch = source
.Cast<DataRowView>()
.First(vw => vw.Row[dummyColumnIndex] != null && vw.Row[dummyColumnIndex].ToString() == DisplayValue);
firstMatch.Row[dummyColumnIndex] = string.Empty;
.Cast()
.First(vw=>vw.Row[dummyclumnindex]!=null和&vw.Row[dummyclumnindex].ToString()==DisplayValue);
firstMatch.Row[dummycolumnidex]=string.Empty;
请注意,如果没有匹配项,这将引发异常,因此您还可以执行以下操作:
var firstMatch = source
.Cast<DataRowView>()
.FirstOrDefault(vw => vw.Row[dummyColumnIndex] != null && vw.Row[dummyColumnIndex].ToString() == DisplayValue);
if(firstMatch != null)
firstMatch.Row[dummyColumnIndex] = string.Empty;
var firstMatch=source
.Cast()
.FirstOrDefault(vw=>vw.Row[dummyclumnindex]!=null和&vw.Row[dummyclumnindex].ToString()==DisplayValue);
if(firstMatch!=null)
firstMatch.Row[dummycolumnidex]=string.Empty;
是的,它可以。我倾向于使用查询语法:
var query = from vw in source.Cast<DataRowView>()
where vw.Row[dummyColumnIndex] != null &&
vw.Row[dummyColumnIndex].ToString() == DisplayValue
select vw;
var item = query.FirstOrDefault();
if (item != null)
item.Row[dummyColumnIndex] = "";
var query=来自source.Cast()中的vw
其中vw.Row[dummyColumnIndex]!=空的&&
vw.Row[dummyColumnIndex].ToString()==DisplayValue
选择大众;
var item=query.FirstOrDefault();
如果(项!=null)
item.Row[dummyColumnIndex]=“”;
正如其他人所指出的:如果找不到匹配项,最好使用“FirstOrDefault”来避免引发异常。是的,但您需要使用IEnumerable的Cast方法将其转换为通用IEnumerable,其中类型参数为“DataRowView”,然后可以执行类似操作。这将使用提供的逻辑(以lambda表达式的形式)计算DataView中的每个记录,以确定它是否匹配。它将返回它找到的第一个,如果没有找到,则返回“null”。您可以任意处理空值;我通常喜欢在这样的情况下抛出异常,除非有一个有效的理由可能找不到匹配项
var match = source.Cast<DataRowView>().FirstOrDefault(
s => s[dummyColumnIndex] != null &&
s[dummyColumnIndex].ToString() == DisplayValue);
if (match == null)
throw new Exception("Could not find match for " + DisplayValue);
match[dummyColumnIndex] = String.Empty;
var match=source.Cast().FirstOrDefault(
s=>s[dummyColumnIndex]!=null&&
s[dummyColumnIndex].ToString()==DisplayValue);
if(match==null)
抛出新异常(“找不到“+DisplayValue”的匹配项);
匹配[dummyColumnIndex]=字符串。空;
如果目标是在列表中查找内容{
如果(已排序)
否则,如果(有效)
否则我就不知道了
}不完全相关……但如果要将字符串与null进行比较,最好使用string.IsNullOrEmpty()。它将捕获字符串不是null而是“”的情况。IsNullOrEmpty(vw.Row[dummyColumnIndex])这太棒了!谢谢那么LINQ本质上是隐式地为我执行循环吗?除了更小的行数之外,它是否也像我之前所做的那样提高了显式循环的性能?谢谢本质上是的,LINQ实际上将为您迭代集合,使用lamdba表达式(s=>'语法)计算每个项,并返回匹配的第一个项。正如其他人指出的,使用“FirstOrDefault”而不是“First”有助于防止找不到匹配项。我将更新答案以包含它。如果您使用
(string)s[dummycolumnidex]
而不是s[dummycolumnidex].ToString()
,那么您可以省去空检查以获得更少的代码。空值将被强制转换为空字符串,而空字符串与DisplayValue
不匹配。当然,除非您实际需要调用DataRowView中的.ToString()方法,因为该对象不支持强制转换为字符串。正如Joel指出的,如果您在DataView上调用“Cast”方法,Matt的答案就可以了。因此,如果您喜欢查询样式语法,也可以这样做。这实际上不会像编写的那样工作,因为source
是IEnumerable
而不是IEnumerable
。这就是为什么需要Jesse答案中的.Cast()
。加上这一点,查询语法应该可以正常工作。