求如何实现两个List比较,并按照元素对齐,不存在的元素用特定元素补齐

浪子要回头 2019-01-14 07:58:27
比如:
处理前
list1 = {1,2,3,4,5,7,8}
list2 = {1,4,5,6,7}

处理后(用0补齐)
list1 = {1,2,3,4,5,0,7,8}
list2 = {1,0,0,4,5,6,7,0}
...全文
348 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2019-01-15
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
	public static void Main()
	{
		// your code goes here
		List<int> list1 = new List<int>(){1,2,3,4,5,7,8};
		List<int> list2 = new List<int>(){1,4,5,6,7};
		List<int> list3 = list1.Union(list2).OrderBy(x => x).Select(x => list1.Any(y => x == y) ? x : 0).ToList();
		list2 = list1.Union(list2).OrderBy(x => x).Select(x => list2.Any(y => x == y) ? x : 0).ToList();
		list1 = list3;
		Console.WriteLine(string.Join(",", list1.Select(x => x.ToString())));
		Console.WriteLine(string.Join(",", list2.Select(x => x.ToString())));
	}
}
1,2,3,4,5,0,7,8 1,0,0,4,5,6,7,0
xboxeer 2019-01-15
  • 打赏
  • 举报
回复
var list1 = new List<int>()
            {
                1,2,3,4,5,7,8
            };
            var list2 = new List<int>()
            {
                1,3,4,5,6,7
            };
            var union = list1.Union(list2).OrderBy(i=>i).ToArray();
            
            for(var i=0;i<union.Length;i++)
            {                
                if (i < list1.Count && list1[i] != union[i])
                {
                    list1.Insert(i, 0);
                }
                if(i>= list1.Count)
                {
                    list1.Add(0);
                }
                if (i < list2.Count && list2[i] != union[i])
                {

                    list2.Insert(i, 0);
                }
                if (i >= list2.Count)
                {
                    list2.Add(0);
                }
            }
首先你的原数据都必须是排序过的 不排序这题没意义 取并集 循环并集 不同的插入0不足的补上0
  • 打赏
  • 举报
回复
引用 4 楼 loveljy_19901114 的回复:
赞一个,大家思路都是先取并集,再排序,然后将各个list与合并后的大list进行比较
笛卡儿积并不是好策略。“正确的”并不一定是实用的。
  • 打赏
  • 举报
回复
如果你学过关系代数(或者 sql)就知道了,这叫做 left join 操作。用 linq 的 left join 计算方法也可以。
xuzuning 2019-01-15
  • 打赏
  • 举报
回复
但是一排序,适用范围就变小了。虽然楼主给的貌似排了序的数据
loveljy_19901114 2019-01-15
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
	public static void Main()
	{
		// your code goes here
		List<int> list1 = new List<int>(){1,2,3,4,5,7,8};
		List<int> list2 = new List<int>(){1,4,5,6,7};
		List<int> list3 = list1.Union(list2).OrderBy(x => x).Select(x => list1.Any(y => x == y) ? x : 0).ToList();
		list2 = list1.Union(list2).OrderBy(x => x).Select(x => list2.Any(y => x == y) ? x : 0).ToList();
		list1 = list3;
		Console.WriteLine(string.Join(",", list1.Select(x => x.ToString())));
		Console.WriteLine(string.Join(",", list2.Select(x => x.ToString())));
	}
}
1,2,3,4,5,0,7,8 1,0,0,4,5,6,7,0
赞一个,大家思路都是先取并集,再排序,然后将各个list与合并后的大list进行比较
  • 打赏
  • 举报
回复
left join后default补齐不就行了…… 先集合1join集合2,得到集合2的新集合2,然后再新集合2去join集合1得到新集合1
ilikeff8 2019-01-15
  • 打赏
  • 举报
回复

static void Main(string[] args)
{
List<int> list1 = new List<int> { 1, 2, 3, 4, 5, 7, 8 };
List<int> list2 = new List<int> { 1, 4, 5, 6, 7 };

int min = Math.Min(list1.Min(), list2.Min());
int max = Math.Max(list1.Max(), list2.Max());

// 方法1
List<int> list3 = Enumerable.Range(min, max).ToList();

Write(list3, list1);
Write(list3, list2);

Console.Read();

// 方法2
for (int i=min;i<=max;i++)
{
if (list1.IndexOf(i)==-1)
{
list1.Add(i);
}

if (list2.IndexOf(i) == -1)
{
list2.Add(i);
}
}

Console.Read();
}

static void Write(List<int> allList, List<int> list)
{
var q = from d in allList
join m in list on d equals m into mr
from mm in mr.DefaultIfEmpty(0)
select mm;

Console.WriteLine(string.Join(",", q.ToArray()));
}
groveer 2019-01-14
  • 打赏
  • 举报
回复
做了一段不太成熟的代码感觉还有很大的优化空间:

int i = 0;
int length = list1.Count > list2.Count ? list1.Count : list2.Count;
while (i<length)
{
if (i == list1.Count)
{
list1.Add(0);
i++;
continue;
}
if (i == list2.Count)
{
list2.Add(0);
i++;
continue;
}
if (list1[i] != list2[i])
{
if (list1[i] > list2[i])
list1.Insert(i, 0);
else
list2.Insert(i, 0);
length = list1.Count > list2.Count ? list1.Count : list2.Count;
}
i++;
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧