字符串数组比较

巴士上的邂逅 2016-07-28 03:12:14
现有N个字符串数组,诸如下列
1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010
1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010
1100 0100 1101 0011 0110 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010
现在想比对这些字符串不同之处,并获取其(红字)索引值,怎么实现?用linq更好,
...全文
196 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
巴士上的邂逅 2016-07-29
  • 打赏
  • 举报
回复
上代码
 var source = richTextBox1.Lines.Where(s => s.Trim() != "").Select(s => s.Select((c, index) => new KeyValuePair<int, char>(index, c))).ToList();
 var tmp = source.First();
 for (int i = 1; i < source.Count; i++)
 {
     tmp = tmp.Join(source[i], f => f, s => s, (f, s) => f);
 }
 var lst = source.First().Select(i => i.Key).Except(tmp.Select(i => i.Key));
谢谢各位的解答,结贴!
巴士上的邂逅 2016-07-28
  • 打赏
  • 举报
回复
根据一楼的启发,已经解决了,明天贴代码!
秋的红果实 2016-07-28
  • 打赏
  • 举报
回复
根据当前需要(不是0就是1),构造二维数组,像个矩阵,算法描述:把每列上的元素(除空格外,转为数字)加起来的和ColSum,要都相等,ColSum只有两种结果:行数Row(对应都是1),0(对应都是0),不是这个结果的,该列对应的列序号就是要的结果 Result可以记录所有不等的位置
秋的红果实 2016-07-28
  • 打赏
  • 举报
回复
支持楼上观点。灵活、高效 我从另一种角度写个,希望执行效率更高些

string s1 = "1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
string s2 = "1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
string s3 = "1100 0100 1101 0011 0110 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
List<string> myArr = new List<string> { s1, s2, s3 };
int ColSum = 0;
int Row = 0;
List<int> Result = new List<int>();
for (int Col=0; Col < myArr[0].Length; Col++)
{
    if(myArr[0][Col].ToString()==" ")
    {
        continue;
    }

    for (Row=0; Row < myArr.Count; Row++)
    {
        ColSum += Convert.ToInt32(myArr[Row][Col].ToString());

    }

    if(!(ColSum==Row || ColSum==0))
    {
        Result.Add(Col);

    }

    ColSum = 0;

}

xuzuning 2016-07-28
  • 打赏
  • 举报
回复
所以还是最原始的最好
        static void Main(string[] args)
        {
            string[] a =
            {
                "1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010",
                "1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010",
                "1100 0100 1101 0011 0110 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010",
            };
            for (var i = 0; i < a[0].Length; i++)
            {
                for (var j = 0; j < a.Length; j++)
                {
                    if (a[j][i] != a[0][i])
                    {
                        Console.WriteLine(i);
                        break;
                    }                   
                }
            }
 
        }
  • 打赏
  • 举报
回复
嗯,写成一个完整的测试,除了上面的“一条语句”就能写好的算法,其它的都很平常
using System;
using System.Collections.Generic;
using System.Linq;

namespace Inhertied
{
    class IL_Method_Test
    {
        public static void Main()
        {
            var s1 = "1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var s2 = "1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var s3 = "1100 0100 1101 0011 0110 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";

            var arr = new List<string> { s1, s2, s3 };
            var result = from i in Enumerable.Range(0, arr[0].Length)
                         where !判断字符完全一致(arr, i)
                         select i;
            foreach (var i in result)
            {
                Console.Write("第{0}个字符有差异:", i);
                foreach (var s in arr)
                    Console.Write(s[i]);
                Console.WriteLine();
            }
            Console.WriteLine(".....................按任意键结束");
            Console.ReadKey();
        }

        private static bool 判断字符完全一致(List<string> arr, int i)
        {
            var c = arr[0][i];
            for (var j = 1; j < arr.Count; j++)
                if (arr[j][i] != c)
                    return false;
            return true;
        }
    }
}
  • 打赏
  • 举报
回复
var arr = new List<string> ();
........
var result = from i in Enumerable.Range(0, arr[0].Length)
                where !判断arr中某位置的字符完全一致(arr, i)  
                select i;
秋的红果实 2016-07-28
  • 打赏
  • 举报
回复
用二维数组,逐个位置进行比较
巴士上的邂逅 2016-07-28
  • 打赏
  • 举报
回复
如果是很多行,这样会很麻烦?
引用 1 楼 xuzuning 的回复:
两个串可以这样
            var s1 = "1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var s2 = "1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var query = from a in s1.ToArray().Select((x, index) => new { k = index, v = x })
                        from b in s2.ToArray().Select((x, index) => new { k = index, v = x })
                        where a.k == b.k && a.v != b.v
                        select a.k;
            Console.WriteLine(string.Join(",", query));
应该是用循环更好
fungchou 2016-07-28
  • 打赏
  • 举报
回复
来个循环的:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> array = new List<string>();

            //array.Add("1100 ……");

            if (array.Count < 1)
                return;

            int minLength = array.Min(m => m.Length);
            for (int idx = 0; idx < minLength; idx++)
            {
                char ch = array[0][idx];
                for (int i = 1; i < array.Count; i++)
                {
                    if (array[i][idx] != ch)
                        Console.WriteLine(idx);
                }
            }
        }
    }
}
xuzuning 2016-07-28
  • 打赏
  • 举报
回复
两个串可以这样
            var s1 = "1100 0100 1101 0011 1100 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var s2 = "1100 0100 1101 0011 1010 0100 1000 0000 0000 0000 0010 0100 1100 0000 1000 0000 0101 0000 0000 0000 0000 0000 1000 0000 0000 1000 0001 1010";
            var query = from a in s1.ToArray().Select((x, index) => new { k = index, v = x })
                        from b in s2.ToArray().Select((x, index) => new { k = index, v = x })
                        where a.k == b.k && a.v != b.v
                        select a.k;
            Console.WriteLine(string.Join(",", query));
应该是用循环更好

110,532

社区成员

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

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

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