我真的被困住了,在这里发布解决方案的你们中的许多人总的来说都很聪明(恕我直言),我想我会看看你们中最好的人能解决这个问题。
一些背景
我正在尝试创建一个列表,该列表必须仅包含特定序列中的不同项目。(它是一个主键,因此必须是不同的(我没有把它作为主键,但我必须使用我得到的东西,你知道它是怎么回事)。
为了便于理解此要求,请考虑从食谱书中创建不同的食谱步骤列表。我的问题是这些“食谱”的“厨师”经常改变他们创造杰作的顺序。
例如:
食谱 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();
}
}