首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linq (或C#代码)自联接表以填充空/空值

问Linq (或C#代码)自联接表以填充空/空值
EN

Stack Overflow用户
提问于 2022-01-21 15:47:18
回答 3查看 144关注 0票数 -1

让我们假设我有一个列表,其中包含缺少值的元素,但匹配id(可能缺少或不匹配id),因此我希望将不为空或不为空的值放入单个元素中,如果有几个值不为空,则在匹配的字段名中转换为IGrouping/list,如果没有,则转换为单个空值,

这是一个例子

代码语言:javascript
复制
     public class MyClass 
        { 
            public int vali;
            public string vala;
            public string valb;
            public long? vall;
         }
代码语言:javascript
复制
      var list = new List<MyClass>()
                {
                  new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
                  new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
                  new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
                  new MyClass{vali=3,vala=null,valb=null,vall=8},
                  new MyClass(){vali= 2,vala=null,valb=null,vall=7},
                };

我想得到以下输出

代码语言:javascript
复制
 {2,"hello",string[] {"how are you","how are you" },int[] {7,7} }
 {3 , "hi" , "how are you doing" ,8 },

使用linq

代码语言:javascript
复制
    list.GroupBy(x=>x.vali).Select(x=>x.FirstOrDefault()).ToList();

返回

代码语言:javascript
复制
 {2,"how are you",null,7},
 {3, "how are you doing",null}

那么,我可以使用什么查询,或者如何实现返回列表(或者像linq那样使用IGrouping,但编写自己的算法)

谢谢

EN

回答 3

Stack Overflow用户

发布于 2022-01-22 07:25:55

有些值具有数组,而另一些值只有一个值,因此不能获得混合输出。一切都是这样或那样。

在我看来,这做了你想做的事:

代码语言:javascript
复制
var result =
    list
        .GroupBy(x => x.vali)
        .Select(gxs => new 
        {
            vali = gxs.Key,
            vala = gxs.Select(gx => gx.vala).Where(x => x != null).ToList(),
            valb = gxs.Select(gx => gx.valb).Where(x => x != null).ToList(),
            vall = gxs.Select(gx => gx.vall).Where(x => x != null).ToList(),
        })
        .ToList();

我得到:

​

​

否则,要获得单个值,请尝试如下:

代码语言:javascript
复制
List<MyClass> result =
    list
        .GroupBy(x => x.vali)
        .Select(gxs => new MyClass()
        {
            vali = gxs.Key,
            vala = gxs.Select(gx => gx.vala).Aggregate((x, y) => x ?? y),
            valb = gxs.Select(gx => gx.valb).Aggregate((x, y) => x ?? y),
            vall = gxs.Select(gx => gx.vall).Aggregate((x, y) => x ?? y),
        })
        .ToList();

使用您的数据,我得到了以下结果:

​

​

票数 2
EN

Stack Overflow用户

发布于 2022-01-21 16:30:31

尝试以下几个方面:

代码语言:javascript
复制
    class Program
    {

        static void Main(string[] args)
        {
            var list = new List<MyClass>()
                {
                  new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
                  new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
                  new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
                  new MyClass{vali=3,vala=null,valb=null,vall=8},
                  new MyClass(){vali= 2,vala=null,valb=null,vall=7},
                  new MyClass(){vali= 2,vala=null,valb="how are you",vall=7},
                  new MyClass {vali=3,vala="hi",valb="how are you doing",vall=null},
                  new MyClass{vali=2,vala="hello",valb="how are you",vall=null},
                  new MyClass{vali=3,vala=null,valb=null,vall=8},
                  new MyClass(){vali= 2,vala=null,valb=null,vall=7},
                };

            var results = list.GroupBy(x => x).ToList();
          
        }
    }
    public class MyClass : IEquatable<MyClass>
    {
        public int vali;
        public string vala;
        public string valb;
        public long? vall;

        public bool Equals(MyClass other)
        {
            return
                (this.vali == other.vali) &&
                (this.vala == other.vala) &&
                (this.valb == other.valb) &&
                (this.vall == other.vall);
        }
        public override bool Equals(object obj)
        {
            return Equals(obj as MyClass);
        }
        public override int GetHashCode()
        {
            return (this.vali.ToString() + "^" + this.vala + "^" + this.valb + "^" + this.vall.ToString()).GetHashCode();
        }

    }
票数 1
EN

Stack Overflow用户

发布于 2022-01-22 07:02:36

我想我找到了我想要的

使用以下查询

代码语言:javascript
复制
     var 

    list2=list.ToDictionary(x=>x).GroupBy(x=>x.Key.vali).Select(x=>new  {  
                      vali =  x.First().Key.vali,
                      vala =   x.Count(v =>  v.Value.vala !=null) > 0  ?x.Where(x=>x.Value.vala!=null).Select(x=>x.Value.vala).ToList() : new List<string> { x.FirstOrDefault(x=>x.Value.vala!=null).Value.vala },
                      valb =  x.Count(v =>  v.Value.valb !=null) > 0  ?x.Where(x=>x.Value.valb!=null).Select(x=>x.Value.valb).ToList() : new List<string> { x.FirstOrDefault(x=>x.Value.valb!=null).Value.valb },
                      vall = x.Count(v =>  v.Value.vall !=null) > 0  ?x.Where(x=>x.Value.vall!=0).Select(x=>x.Value.vall).ToList() : new List<long?> { x.FirstOrDefault(x=>x.vall!=null).Value.vall },
    
                     }).ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70803984

复制
相关文章

相似问题

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