私は本当に行き詰まっており、ここに解決策を投稿している皆さんの多くは概して素晴らしい (IMHO) ので、この問題を解決できる最高のものを見つけたいと思いました.
いくつかの背景
特定の順序で個別のアイテムのみを含める必要があるリストを作成しようとしています。(これは主キーなので、区別する必要があります (主キーにはしませんでしたが、与えられたものを使用する必要があります。どうなるかはわかります)。
この要件を理解しやすくするために、レシピ集からレシピ ステップの個別のリストを作成することを考えてみてください。私の問題は、これらの「レシピ」の「料理人」が傑作を作成する順序を頻繁に変更することです。
例えば:
レシピ1
- フォークを使って卵を泡立てる
- フライパンでマーガリンを溶かす
- 卵を入れる
- 絶え間なくかき回す
- 皿
- お好みで塩・こしょうを加える
レシピ2
- ボウルに卵を割る
- フォークを使って卵を泡立てる
- 弱火でフライパンにマーガリンを溶かす
- 卵を入れる
- 絶え間なくかき回す
- 皿
- 仕える
- お好みで塩・こしょうを加える
レシピ3
- フォークを使って卵を泡立てる
- お好みで塩・こしょうを加える
- 弱火でフライパンにマーガリンを溶かす
- 卵を入れる
- 絶え間なくかき回す
- 皿
おわかりのように、「塩とコショウを追加してください...」は、レシピ 3 で 2 番目になることはできず、レシピ 1 と 2 で正しい順序になることはありません。
「問題のある」リスト項目を識別し、その末尾にピリオドを追加して一意にすることができれば、これは解決策として機能すると思います。
データセット (SQL クエリによって取得された) が正しい順序で重複し、文字列型のリストに配置されている場合、C# でこれを行うにはどうすればよいですか? ここでは LINQ は必須ではありませんが、ソリューションが提供される場合は、LINQ を使用することを恐れません。
具体的には、次のようなコード (または疑似コード):
- 複製して変更する必要があるリスト項目を識別します。
- 新しく作成された大きなリスト (仮定) 内の WHERE が、配置される新しく変更されたリスト項目であると判断します。
あなたの最初の質問が「あなたの作品を見せてください」である場合、私はこれについてかなりの作業を行ったので、コードは一般的に長いことをご承知おきください。
疑似コードから作業するか、私のデータセットでコードを試していただければ幸いです。また、関連する可能性のある他のソリューションを読んで満足しています。
ありがとう、私はあなたの解決策を見るのを楽しみにしています.
--編集:コードを投稿しないと、人々はそれを好まないという印象を受け始めています。では、ここまでです (上で長いと言いました)。コードは機能しますが、問題は解決しません。重複のない個別のリストを順番に返します。(下の書式が悪い場合はご容赦ください)
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();
}
}