मैं एक सूची है (सटीक होना करने के लिए System.Collections.Immutable से ImmutableHashSet<ListItem>
) आधार मदों की और निम्नलिखित कोडImmutableHashSet .Contains रिटर्न झूठी
_baseList.Contains(derivedItem)
फोन करने की कोशिश, लेकिन इस झूठी देता है।
हालांकि निम्नलिखित कोड लाइनों सब लौट सच
object.ReferenceEquals(_baseList.First(), derivedItem)
object.Equals(_baseList.First(), derivedItem)
_baseList.First().GetHashCode() == derivedItem.GetHashCode()
मैं भी निम्नलिखित लिख सकते हैं और यह सच रिटर्न:
_baseList.OfType<DerivedClass>().Contains(derivedItem)
हूँ क्या मैं गलत कर रही है, मैं चाहते हैं ओफटाइप सामान लिखने से बचें।
संपादित करें:
private ImmutableHashSet<BaseClass> _baseList;
public class BaseClass
{
}
public class DerivedClass : BaseClass
{
}
public void DoStuff()
{
var items = _baseList.OfType<DerivedClass>().ToList();
foreach (var derivedItem in items)
{
RemoveItem(derivedItem);
}
}
public void RemoveItem(BaseClass derivedItem)
{
if (_baseList.Contains(derivedItem))
{
//doesn't reach this place, since _baseList.Contains(derivedItem) returns false...
_baseList = _baseList.Remove(derivedItem);
}
//object.ReferenceEquals(_baseList.First(), derivedItem) == true
//object.Equals(_baseList.First(), derivedItem) == true
//_baseList.First().GetHashCode() == derivedItem.GetHashCode() == true
//_baseList.OfType<DerivedClass>().Contains(derivedItem) == true
}
EDIT2:
यहाँ मेरी समस्या का एक प्रतिलिपि प्रस्तुत करने योग्य कोड, ImmutableHashSet<>
कैश GetHashCode
की तरह लगता है और वर्तमान GetHashCode
सूची के अंदर प्रविष्टियों के साथ तुलना नहीं है , ImmutableHashSet<>
बताने का कोई तरीका है कि आइटम के GetHashCode
आइटम अलग-अलग हो सकते हैं, कम से कम उस आइटम के लिए जो मैं वर्तमान में जांच रहा हूं क्योंकि यह वही संदर्भ है ...
namespace ConsoleApplication1
{
class Program
{
private static ImmutableHashSet<BaseClass> _baseList;
static void Main(string[] args)
{
_baseList = ImmutableHashSet.Create<BaseClass>();
_baseList = _baseList.Add(new DerivedClass("B1"));
_baseList = _baseList.Add(new DerivedClass("B2"));
_baseList = _baseList.Add(new DerivedClass("B3"));
_baseList = _baseList.Add(new DerivedClass("B4"));
_baseList = _baseList.Add(new DerivedClass("B5"));
DoStuff();
Console.WriteLine(_baseList.Count); //output is 5 - put it should be 0...
Console.ReadLine();
}
private static void DoStuff()
{
var items = _baseList.OfType<DerivedClass>().ToList();
foreach (var derivedItem in items)
{
derivedItem.BaseString += "Change...";
RemoveItem(derivedItem);
}
}
private static void RemoveItem(BaseClass derivedItem)
{
if (_baseList.Contains(derivedItem))
{
_baseList = _baseList.Remove(derivedItem);
}
}
}
public abstract class BaseClass
{
private string _baseString;
public string BaseString
{
get { return _baseString; }
set { _baseString = value; }
}
public BaseClass(string baseString)
{
_baseString = baseString;
}
public override int GetHashCode()
{
unchecked
{
int hashCode = (_baseString != null ? _baseString.GetHashCode() : 0);
return hashCode;
}
}
}
public class DerivedClass : BaseClass
{
public DerivedClass(string baseString)
: base(baseString)
{
}
}
}
अगर मैं बदल जाएगा ImmutableHashSet<>
ImmutableList<>
करने के लिए कोड ठीक काम करता है, इसलिए यदि आप लोग किसी भी अच्छा विचार मैं इस सूची में बदल जाएगा के साथ नहीं आते हैं।
लेकिन यह सिर्फ असफल नहीं होता है क्योंकि बेसलिस्ट 'ListItem' से भरा हुआ है और आप जिस वस्तु को खोज रहे हैं वह है' DerivedClass' – EaterOfCode
@EaterOfCode DerivedClass बेसक्लास से निकला है। –
@EaterOfCode और यदि सूची में कोई DerivedClass ऑफ़ टाइप टाइप नहीं होगा <>()। इसमें भी झूठी वापसी होगी, जो मामला नहीं है। –