c# - 删除列表列表中列的冲突

标签 c# list

我正在尝试使用一些简单的方法来消除数据结构列中的任何冲突。

我有 int 列表的列表,例如!

0 0 0 2 3 4

1 0 2 3 0 0

0 2 1 4 0 0

正如您只看到 5 个数字 0、1、2、3、4,我希望在 中有相同 数字或>每个列。上面的例子应该是这样的:

0 0 0 2 3 4 0 0 0 0 0 0

1 0 2 0 0 0 2 3 0 0 0 0

0 2 0 0 0 0 0 0 1 4 0 0

所以我为此用 C# 编写了一个简单的程序:

for (int t1 = 0; t1 < myList.Count; t1++)
      {
        for (int t2 = 0; t2 < myList[t1].Count; t2++)
            {
               for (int t3 = 0; t3 < myList.Count; t3++) 
                    {
                        if (myList[t1][t2] != myList[t3][t2])
                              {
                                 if (myList[t1][t2] != 0)
                                     {
                                        if (myList[t3][t2] != 0)
                                           { 
                                             myList[t3].Insert(t2, 0);
                                            for (int uui = 0; uui < myList.Count; uui++)
                                                {
                                                    if (uui != t3)
                                                    {
                                                        myList[uui].Add(0);
                                                    }
                                                }

                                            }
                                        }  
                                    }
                                }
                            }
                        }

如您所见,我正在按列搜索,它会向每个子列表添加零,但带有插入的子列表除外,以避免超出范围的异常。 有趣的是它通常 有效!但在某些情况下仍然存在冲突。 我的问题是为什么它只适用于某些情况(通常是最大 5x5 的小情况)?

此数据集的另一个示例:

0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3 
1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0 
0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 3 0 0 0 0 
0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 2 4 1 
0 0 3 0 3 0 1 0 3 0 0 0 0 0 4 3 0 0 0 0 0 0

结果是:

0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 0 3 0 0 3 0 0 0 0 0 0 0 0 0 0 0 1 0 3 0 0 0 0 0 0 4 3 0 0 0 0 0 0 0 0 0 0 0 0 

不幸的是,冲突仍然存在:第一个列表从右边开始的第一个“3”在第四个列表中有下面的数字 1。第一个列表中的“4”在列表 nr 4 的下面有“3”。

最佳答案

当您遇到冲突时,您将在该行的末尾添加。 尝试解决整个列的冲突。 因此,较低的行不能添加冲突,这些冲突不会在以后的迭代中解决。

一个完整的测试程序:

void Main()
{
//  var s = "0 0 0 2 3 4\r\n1 0 2 3 0 0\r\n0 2 1 4 0 0";
    var s = @"
    0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 3 3 
    1 0 0 0 0 0 1 4 3 2 2 0 0 0 0 0 0 0 0 0 0 0 
    1 0 0 0 0 0 0 0 0 2 0 3 2 2 4 0 0 0 0 0 0 0 
    0 0 3 0 0 0 0 0 0 2 0 3 0 0 0 3 4 3 0 0 0 0 
    0 4 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 1 2 4 1 
    0 0 3 0 3 0 1 0 3 0 0 0 0 0 4 3 0 0 0 0 0 0
";

    var myList = s.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Select (x => x.Split(new char [] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select (y => Int32.Parse(y)).ToList()).ToList();

    Print(myList, "Before");

    int rows = myList.Count;    

    for (int row = 0; row < rows; row++)
    for (int col = 0; col < myList[row].Count; col++)
    for (int t3 = 0; t3 < rows; t3++)
    if (myList[row][col] != 0 && myList[t3][col] != 0 && myList[row][col] != myList[t3][col])
    {           
        //Print(myList, "Before Step");
        for (int uui = 0; uui < rows; uui++)
        {
            if (uui < t3) // yours: if (uui != t3)
            {
                // yours: myList[uui].Add(0);
                myList[uui].Insert(col + 1, 0);
            }
            else
            {
                myList[uui].Insert(col, 0);
            }
        }
//      Print(myList, "After Step");
        break;      
    }       

    Print(myList, "After");
}

public void Print(List<List<int>> list, string header)
{   
    Console.WriteLine(header);
    Console.WriteLine(ToString(list));
}

public string ToString(List<List<int>> list)
{
    return String.Join(Environment.NewLine, list.Select (l => String.Join(" ", l)));
}

关于c# - 删除列表列表中列的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230188/

相关文章:

c# - 将 'Type' 传递给通用构造函数

c# - 比 String.Replace() 更快

python - 根据每个元组的第一个值比较两个元组列表(但返回所有元组值)

python - 使用通用 id 键合并两个字典列表

list - 如何将函数应用于列表的两个元素 - Haskell

c# - 找不到指定的过程。 (来自 HRESULT : 0x8007007F) 的异常

c# - 使用列表框确定选择了哪个对象

c# - 通过 json.net 从流中反序列化多个对象

java - 哪种列表实现最适合从前面和后面删除和插入?

c# - 在 C# 中,通过类(class)成员之一搜索类(class)列表的最佳方式是什么?