首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq:用条件对元素进行分组

Linq:用条件对元素进行分组
EN

Stack Overflow用户
提问于 2022-09-03 05:08:14
回答 1查看 61关注 0票数 0

我有这份名单-

代码语言:javascript
复制
    public class SecretAgents
    {
        public string Name {get; set;}
        public List<string> SecretData {get; set;}
        public int GroupID {get; set;}
    }

    List<SecretAgents> secretAgents = new List<SecretAgents>();

    // Each item has a total of 256 elements in it under the
    // SecretData list of string that consists of "apple" and "orange"

    secretAgents.Add(new SecretAgents { Name= "SecretAgent 1", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 2", GroupID= 0, SecretData= new List<string> { "apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","apple","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 3", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple","apple","apple","orange","orange","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","apple","orange","apple","apple" } });
    secretAgents.Add(new SecretAgents { Name= "SecretAgent 4", GroupID= 0, SecretData= new List<string> { "orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","apple","orange","orange","apple","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","apple","orange","orange","orange","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","apple","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange","apple","orange","orange","orange","orange","apple","apple","orange","orange","orange","orange","orange","orange","orange","orange","orange" } });

不同项目之间的元素相等(“苹果”和“橙色”):

  • 秘密特工1和秘密特工3: 248
  • 秘密特工2和秘密特工4: 256

在其他可能性中(例如: Agent 1和Agent 3,Agent 2和Agent 3等),相等的元素小于200。

现在,我想要的是分组所有物品(秘密特工),至少有200个相等的元素(“苹果”和“橙色”)。

预期结果

秘密特工1:组ID 1

秘密特工3:组ID 1

秘密特工2:组ID 2

秘密特工4:组ID 2

伪码:

迭代secretAgents列表中的每个项,然后使用Linq Zip函数:

代码语言:javascript
复制
    int index=0;    
    foreach(var item in secretAgents)
    {
        index++;
        int equalElements = item.Zip(item, (i, j) => i.SecretData == j.SecretData).Count(eq => eq);
        if (equalElements>200)
        {
            item.GroupID=index;
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-03 05:51:25

这是一个痛苦的质疑:

代码语言:javascript
复制
var query =
    from q in
    (
        from sa1 in secretAgents
        from sa2 in secretAgents
        where sa1.Name.CompareTo(sa2.Name) == -1
        let count = sa1.SecretData.Zip(sa2.SecretData, (First, Second) => (First, Second)).Where(x => x.First == x.Second).Count()
        where count > 200
        group new[] { sa1, sa2 } by count
    ).Select((xss, i) => (xss, i))
    from xs in q.xss
    from x in xs
    select new { Name = x.Name, GroupID = q.i + 1 };

它给了我:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73589779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档