-2

我真的被困住了,在这里发布解决方案的你们中的许多人总的来说都很聪明(恕我直言),我想我会看看你们中最好的人能解决这个问题。

一些背景

我正在尝试创建一个列表,该列表必须仅包含特定序列中的不同项目。(它是一个主键,因此必须是不同的(我没有把它作为主键,但我必须使用我得到的东西,你知道它是怎么回事)。

为了便于理解此要求,请考虑从食谱书中创建不同的食谱步骤列表。我的问题是这些“食谱”的“厨师”经常改变他们创造杰作的顺序。

例如:

食谱 1

  • 用叉子搅打鸡蛋
  • 在平底锅中融化人造黄油
  • 倒入鸡蛋
  • 不断搅拌
  • 盘子
  • 根据需要添加盐和胡椒

食谱 2

  • 将鸡蛋打入碗中
  • 用叉子搅打鸡蛋
  • 在平底锅中用小火融化人造黄油
  • 倒入鸡蛋
  • 不断搅拌
  • 盘子
  • 服务
  • 根据需要添加盐和胡椒

食谱 3

  • 用叉子搅打鸡蛋
  • 根据需要添加盐和胡椒
  • 在平底锅中用小火融化人造黄油
  • 倒入鸡蛋
  • 不断搅拌
  • 盘子

正如您所说的那样,“添加盐和胡椒……”不能在食谱 3 中排在第二位,并且在食谱 1 和 2 中仍然保持正确的顺序。

我想如果我可以识别“违规”列表项并在其末尾添加一个句点,从而使其独一无二,这将作为一个解决方案。

如何在 C# 中执行此操作,给定一个数据集(由 SQL 查询获取),其中重复项以正确的顺序排列并放入字符串类型的列表中?LINQ 在这里不是必需的,但如果它提供了解决方案,我不害怕使用它。

具体代码(或伪代码):

  • 标识需要复制和修改的列表项。
  • 确定新创建的大列表中的 WHERE(假设)是要放置的新修改的列表项。

如果您的第一个问题是“向我展示您的工作”,请注意我已经为此做了很多工作,而且代码通常很长。
我很高兴使用伪代码或使用我的数据集尝试您的代码。我也很高兴阅读其他可能相关的解决方案。

谢谢,我期待看到您的解决方案。

--edit:我开始觉得如果你不发布代码,人们就会不喜欢它。所以就到这里了(我在上面说它很长)。该代码有效,但不能解决问题。它按顺序返回一个不同的列表,没有重复。(如果以下格式不好请见谅)

    public void GetNewRecipeItemsFromDB(string RequestedRecipeName)
    {
        string connString = string.Empty;
        string strGetRecipeElements_Sql = "SQL that returns the dataset";
        string connString = GetConnectionString();

        using (SqlConnection conn = new SqlConnection(connString))
        {
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = strGetRecipeElements_Sql;
            SqlDataReader reader = null;

            try
            {
                conn.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(strGetRecipeElements_Sql, conn);
                DataSet RecipeItems = new DataSet();
                adapter.Fill(RecipeItems, "RecipeItems");
                reader = cmd.ExecuteReader();
                List<string> RecipeItemList = new List<string>();

                //Create an array with existing RecipeItems

                int readerCount = 0;


                while (reader.Read())
                {
                    RecipeItems GSI = new RecipeItems();
                    GSI.RecipeItem = reader[0].ToString();
                    GSI.Sequence = Convert.ToInt32(reader[1].ToString());
                    GSI.Rank = Convert.ToInt32(reader[2].ToString());


                    RecipeItemList.Add(GSI.RecipeItem.ToString());
                    readerCount++;

                }
                string[] CurrentRecipeItemArray = new string[readerCount];
                string[] UpdatedRecipeItemArray = new string[readerCount];

                //RecipeItemList.Sort();
                label1.Text = "";
                textBox1.Text = "";
                CurrentRecipeItemArray = RecipeItemList.ToArray();

                for (int y = CurrentRecipeItemArray.Length - 1; y >= 0; y--)
                {


                    textBoxDBOrginal.Text += CurrentRecipeItemArray[y].ToString() + Environment.NewLine;
                }

                string[] lines = textBoxDBOrginal.Text.ToString().Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
                List<string> UniqueRecipeItemsInvertedList = new List<string>();
                if (lines.Length > 0)
                {
                    //OK it's not null lets look at it.
                    int lineCount = lines.Length;
                    string NewCompare = string.Empty;

                    for (int z = 0; z < lineCount; z++)

                    {
                        NewCompare = lines[z];
                        if (!UniqueRecipeItemsInvertedList.Contains(NewCompare))
                        {
                            UniqueRecipeItemsInvertedList.Add(NewCompare);

                        }
                    }
                }
                UniqueRecipeItemsInvertedList.Reverse();

                foreach (string s in UniqueRecipeItemsInvertedList)
                {
                    if (!string.IsNullOrEmpty(s))
                    {

                        listBox7.Items.Add(s.ToString());

                    }
                }


            }


            catch (SqlException ex)
            {
                MessageBox.Show(ex.Errors.ToString());

            }
            conn.Close();


        }



    }
4

3 回答 3

1

答案已经在这个网站上。 如何使用 LINQ 重命名列表中的重复项

代码是:

      IEnumerable<String> GetUnique(IEnumerable<String> list)
    {
        HashSet<String> itms = new HashSet<String>();
        foreach(string itm in list)
        {
            string itr = itm;
            while(itms.Contains(itr))
            {
                itr = itr + "_";
            }
            itms.Add(itr);
            yield return itr;
        }
    }   
于 2013-10-17T17:19:59.460 回答
0

由于 Dictionary 不允许重复条目(它抛出 ArgumentException 是未处理的异常),因此处理确保唯一性和序列顺序的“繁重工作”(仍在测试那个)。我认为我使用 GSI.Sequence 错误,因为收据项目可能有多个序列。(这不是答案,而是我可以放代码的地方。我希望我做对了)给http://williablog.net/williablog/post/2011/08/30/Generic-AddOrUpdate-Extension-for的提示-IDictionary.aspx

      while(reader.Read())
     {
                    RecipeItems GSI = new RecipeItems();
                    GSI.RecipeItem = reader[0].ToString();
                    GSI.Sequence = Convert.ToInt32(reader[1].ToString());
                    GSI.RecipeName = reader[2].ToString();
                    GSI.MaxSequence = Convert.ToInt32(reader[3].ToString());



                    if (dictionary.ContainsKey(GSI.RecipeItem))
                    {
                          dictionary.[GSI.RecipeItem] = GSI.Sequence);
                    }
                    else
                    {    
                        dictionary.Add(GSI.RecipeItem, GSI.Sequence);
                    }




    } 

我认为这里的最终答案最终是我不一定预见或渴望的。大约有 94 个独特的项目,您最终将在 20 个食谱的过程中获得大约 428 个独特的食谱项目的列表。这会给我一个列表,我可以在其中以正确的顺序获得适当的食谱项目。我仍然认为我对此的逻辑是错误的,但是当您认为每个食谱有几个食谱项目乱序并且必须复制并且将其乘以食谱数量时,这是有道理的。

于 2013-08-15T18:32:08.910 回答
0

我得出的结论是,尽管可以做到这一点,而且我已经接近了,但我只是没有技能/知识来完成它。

它相当于:

  1. 循环浏览食谱总数并将食谱名称放在列表中
  2. 对于配方列表中的每个配方名称,从数据库获取配方步骤和序列并放入排序列表中(这是一个不确定的位)。
  3. 此时,如果您只想要不同的项目,您就拥有了所需的所有数据。ListName.Distinct()
  4. 循环浏览 SortedList 以查看键/值是否以正确的顺序存在仍然是我的丧钟。我一直遇到密钥已存在/密钥不存在异常。如果我能破解这个坚果,我就解决了这个问题。

我学到了很多关于 list<>、sortedList<> 和 List 以及拥有自己的类和方法的力量。例如:RecipeInfo.RecipeItemsList 让生活变得如此轻松。

我还没有弄清楚为什么这里没有人想碰这个或者为什么它被降级了。这种经历可能会导致我在向 stackoverflow.com 发布另一个问题之前犹豫不决。

于 2013-08-29T15:42:59.117 回答