Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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# 使用linq更新值_C#_Linq - Fatal编程技术网

C# 使用linq更新值

C# 使用linq更新值,c#,linq,C#,Linq,我正在尝试使用linq为MVC Combobox网站更新IEnumerable的Selected属性。但是,这不起作用,如去bug结果所示:条件的Count()返回一个项,而的Count()返回0 public IEnumerable<SelectListItem> Categories { get; set; } public CategoryModel Category { get { return category; } set {

我正在尝试使用linq为MVC Combobox网站更新
IEnumerable
Selected
属性。但是,这不起作用,如去bug结果所示:条件的
Count()
返回一个项,而
Count()
返回0

public IEnumerable<SelectListItem> Categories { get; set; }

public CategoryModel Category
{
    get { return category; }
    set 
    {
        category = value;
        Categories.Where(x => x.Value == value.Id.ToString()).First().Selected = true;
    }

//Debugging Results
//?Categories.Where(x => x.Value == value.Id.ToString()).Count()
//1
//?Categories.Count(x => x.Selected == true);
//0

}

LINQ是查询您的数据源而不是修改它

无论如何,您当前的方法有一个缺点,您可以选择一个,但不会取消选择其他方法。所以你需要一个循环:

public CategoryModel Category
{
    get { return category; }
    set 
    {
        category = value;
        // consider to use a lock here to avoid multi threading issues
        foreach(SelectListItem catItem in Categories)
           catItem.Selected = catItem.Value == value.Id.ToString();
    }
}

如果要修改集合,我将使用方法
SetSelectedCategory
而不是属性。

LINQ是查询您的数据源而不是修改它

无论如何,您当前的方法有一个缺点,您可以选择一个,但不会取消选择其他方法。所以你需要一个循环:

public CategoryModel Category
{
    get { return category; }
    set 
    {
        category = value;
        // consider to use a lock here to avoid multi threading issues
        foreach(SelectListItem catItem in Categories)
           catItem.Selected = catItem.Value == value.Id.ToString();
    }
}

如果要修改集合,我将使用方法
SetSelectedCategory
而不是属性。

IEnumerable不能保证更改在枚举中持久化。 这一切最终都取决于底层实现(列表、数组、可观察对象等)

您可以选择将实际类别更改为可写集合(如列表)。。。 但您可能无法做到这一点,或者您可能只是希望保持精简并继续使用IEnumerable。 在这种情况下,您可以简单地对原始集合进行变异,并将其投影到原始集合上

void Main()
{
    Categories = Load();

    var active = new Func<CategoryModel, int, CategoryModel>((category, match) =>
    {
        return new CategoryModel
        {
            Id = category.Id,
            Name = category.Name,
            Active = category.Id == match
        };
    });

    Categories = Categories.Select(p => active(p, 2));
    Categories.Dump();
}

public IEnumerable<CategoryModel> Categories { get; set; }

public IEnumerable<CategoryModel> Load()
{
    yield return new CategoryModel { Id=1, Name = "one" };
    yield return new CategoryModel { Id=2, Name = "two" };
    yield return new CategoryModel { Id=3, Name = "three" };
}

public class CategoryModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
}


Id|Name|Active
1 one False 
2 two True 
3 three False 
void Main()
{
类别=加载();
活动变量=新函数((类别,匹配)=>
{
返回新的CategoryModel
{
Id=类别。Id,
名称=类别。名称,
活动=类别。Id==匹配
};
});
类别=类别。选择(p=>active(p,2));
类别。Dump();
}
公共IEnumerable类别{get;set;}
公共IEnumerable负载()
{
返回新的CategoryModel{Id=1,Name=“one”};
返回新的CategoryModel{Id=2,Name=“two”};
返回新的CategoryModel{Id=3,Name=“three”};
}
公共类类别模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
Id |名称|激活
一个错误
2两个是真的
3三个错误

这也是为了强调,您可以使用linq进行使用“投影”的“转换”

IEnumerable并不能保证更改在枚举中持久化。 这一切最终都取决于底层实现(列表、数组、可观察对象等)

您可以选择将实际类别更改为可写集合(如列表)。。。 但您可能无法做到这一点,或者您可能只是希望保持精简并继续使用IEnumerable。 在这种情况下,您可以简单地对原始集合进行变异,并将其投影到原始集合上

void Main()
{
    Categories = Load();

    var active = new Func<CategoryModel, int, CategoryModel>((category, match) =>
    {
        return new CategoryModel
        {
            Id = category.Id,
            Name = category.Name,
            Active = category.Id == match
        };
    });

    Categories = Categories.Select(p => active(p, 2));
    Categories.Dump();
}

public IEnumerable<CategoryModel> Categories { get; set; }

public IEnumerable<CategoryModel> Load()
{
    yield return new CategoryModel { Id=1, Name = "one" };
    yield return new CategoryModel { Id=2, Name = "two" };
    yield return new CategoryModel { Id=3, Name = "three" };
}

public class CategoryModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Active { get; set; }
}


Id|Name|Active
1 one False 
2 two True 
3 three False 
void Main()
{
类别=加载();
活动变量=新函数((类别,匹配)=>
{
返回新的CategoryModel
{
Id=类别。Id,
名称=类别。名称,
活动=类别。Id==匹配
};
});
类别=类别。选择(p=>active(p,2));
类别。Dump();
}
公共IEnumerable类别{get;set;}
公共IEnumerable负载()
{
返回新的CategoryModel{Id=1,Name=“one”};
返回新的CategoryModel{Id=2,Name=“two”};
返回新的CategoryModel{Id=3,Name=“three”};
}
公共类类别模型
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共bool活动{get;set;}
}
Id |名称|激活
一个错误
2两个是真的
3三个错误

这也是为了强调,您可以使用linq进行“转换”,使用“投影”

“不工作”不是一个充分的错误描述。任何异常、错误消息、未执行的行为?顺便说一句:LINQ代表“语言集成查询语言”,它用于查询,而不是用于副作用和改变事物。顺便说一句,您当前的方法将选择一个,但如果已经选择了另一个,则不会取消选择除了@TimSchmelter指出的缺陷之外,此处未显示的代码中肯定还有其他错误,因为如果设置了Category的值,则必须在找到的项目上更新所选的值,否则将引发异常。您是否100%确定在代码执行过程中已达到set-on-Category属性?对于投票否决此问题的任何人。我认为这不合适!如果您仔细阅读代码,OP面临的问题是显而易见的。没有必要否决它。如果他误解了LINQ这样的概念,请帮助他!不要投反对票。他没有要求你做他的家庭作业!这是一个non到目前为止能够实际解决的实际问题。您在哪里设置了调试器制动点
First()。如Gerrie所述,如果没有具有该ID的项,则选中的
将引发异常。因此,必须在一个项上将该属性设置为true。您在哪里检查类别。计数(x=>x.Selected==true)
?“不工作”不是足够的错误描述。任何异常、错误消息、未执行的行为?顺便说一句:LINQ代表“语言集成查询语言”,它用于查询,而不是用于副作用和改变事物。顺便说一句,您当前的方法将选择一个,但如果已经选择了另一个,则不会取消选择除了@TimSchmelter指出的缺陷之外,此处未显示的代码中肯定还有其他错误,因为如果设置了Category的值,则必须在找到的项目上更新所选的值,否则将引发异常。您是否100%确定在代码执行过程中已达到set-on-Category属性?对于投票否决此问题的任何人。我认为这不合适!如果您仔细阅读代码,OP面临的问题是显而易见的。没有必要否决它。如果他误解了LINQ这样的概念,请帮助他!不要投我的反对票