当前位置:  开发笔记 > 编程语言 > 正文

Linq在while-header中的问题

如何解决《Linq在while-header中的问题》经验,为你挑选了1个好方法。

我正在尝试在我的项目中找到下一个可用的Groupname.我希望组名看起来像"Gruppe 1","Gruppe 2"等等.这就是我到目前为止所得到的:

int i = 0;
while ((from GroupViewModel g in _groups
        where g.GroupName == ("Gruppe " + (++i).ToString())
        select g).Any());
Group group = new Group() { Name = string.Format("Gruppe {0}", i) };
_groups.Add(new GroupViewModel(group));

我认为这是我的问题的一个很酷的解决方案,但我开始测试代码.
如果_groups为空,则第一组是"Gruppe 0".
如果_groups包含1个组(名为"Gruppe 1"),则生成的组名称为"Gruppe 2".
如果_groups包含1个组(名为"Gruppe 2"),则生成的组名称为"Gruppe 1",但如果我添加另一个组,则结果名称也为"Gruppe 2".我做了很多测试用例,结果总是很奇怪.

initial Groupnames             | Resulting names
-empty-                        | "Gruppe 0", "Gruppe 1", "Gruppe 2", ...
"Gruppe 1"                     | "Gruppe 2", "Gruppe 3", "Gruppe 4", ...
"Gruppe 2"                     | "Gruppe 1", "Gruppe 2", "Gruppe 3", ...
"Gruppe 1", "Gruppe 2"         | "Gruppe 3", "Gruppe 4", "Gruppe 5", ...
"Gruppe 1", "Gruppe 3"         | "Gruppe 5", "Gruppe 6", "Gruppe 7", ...
"Gruppe 1", "Gruppe 4"         | "Gruppe 3", "Gruppe 4", "Gruppe 5", ...
"Gruppe 2", "Gruppe 1"         | "Gruppe 2", "Gruppe 3", "Gruppe 4", ...

那么,有什么线索吗?



1> Jon Skeet..:

好吧,每个条目i++都会被调用,无论它是否匹配.

我建议按组名创建查找,然后只使用循环来提取结果.但是,我真的不清楚你想要的是什么.您是否只是想找到第一个"可用"组ID并GroupViewModel为其添加新ID ?如果是这样,我会做类似的事情:

var lookup = _groups.ToLookup(group => group.GroupName);

for (int i=0; i < int.MaxValue; i++)
{
    string candidateName = "Gruppe " + i;
    if (!lookup.Contains(candidateName)
    {
        Group group = new Group { Name = candidateName };
        _groups.Add(new GroupViewModel(group));
        break;
    }
}

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有