私はFilterItemsのリストを持っています。各FilterItemは、ブール値の文字列&で構成されています。例えば"0"かつfalse。リスト。foreachループを介する際にList.Containsが機能しない
私はそうのようなリスト宣言している:
List<FilterItem> filter = new List<FilterItem>();
私は、DataTableの列を反復処理していますが、意図はフィルタにその列からすべての単一の値を追加することです - と値が二回発生した場合 - フィルタリストに繰り返しエントリを追加しないでください。 - 私は、これは、foreachループのbeacuseだと思う - しかし、私
List<FilterItem> filter = new List<FilterItem>(); //initialise new list
foreach (DataRow row in RawResults.Rows) //For each row in DT
{
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
}
を問題が含まれての結果はMYITEMがすでにリスト内の項目と同じであっても、常に偽であるということです。これは私がやっているものですなぜフィルタリストがそのループの外で宣言されているのか理解していない。 foreachループの外側でmyItemを宣言しようとしましたが、それによって差異がゼロになります。
私は次のような場合:
List<FilterItem> filter = new List<FilterItem>(); //initialise new list
foreach (DataRow row in RawResults.Rows) //For each row in DT
{
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
FilterItem myItem = new FilterItem { Name = row.ItemArray[i].ToString(), Checked = CheckState.Checked }; //create item
if (!filter.Contains(myItem)) //if item doesn't exist
{
filter.Add(myItem); //add it
}
}
.Containsが、それは正しく、trueになります(foreachループの同じ繰り返し内)と呼ばれる2回目は、ちょうどforeachループが再び周りに繰り返されていないとき。
'FilterItem'のコードを表示してください。私の推測は、 'Equals'と' GetHashCode'をオーバーライドしないということです。つまり、 'Contains'は値の平等の代わりに参照の平等を行います。 – juharr