Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林克能帮我做这个吗?_C#_.net_Vb.net_Linq - Fatal编程技术网

C# 林克能帮我做这个吗?

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)

Linq的新功能,非常激动。但是,我想看看是否可以使用LINQ执行以下操作:

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()
。加上这一点,查询语法应该可以正常工作。