Cant compare collections

hi, i cant solve one problem:
SELECT
be.Name, cardinality(be.Project) As project_count, cardinality(be.DoneProjects) As DoneProject_count
FROM bureau be
Order BY be.Name;
Is it possible to compare project_count with done_project, for example: project_count=4 and done_project_count=2 I want to get undone_projects=2..how can i do it?

SELECT Name, project_count, doneproject_count, project_count-doneproject_count as undoneproject_count
from (
    SELECT be.Name, cardinality(be.Project) As project_count, cardinality(be.DoneProjects) As DoneProject_count
    FROM bureau be
    Order BY be.Name
    );

Similar Messages

  • Comparing Collections of EJBs

    If i have a Collection of EJB Objects, is it possible to use myCollection.contains(MyEJBObj)?
    This method uses Object.equals, but ejb's compare with EJBObject.isIdentical.
    If i cant use contains(obj), do i have to write my own search algorithm or is there already one in the jdk?
    Thanks,
    toby

    you can use it
    from ejb spec:
    Note that the Enterprise JavaBeans architecture does not specify �object equality� (i.e. use of the ==
    operator) for entity object references. The result of comparing two object references using the Java programming
    language Object.equals(Object obj) method is unspecified. Performing the
    Object.hashCode() method on two object references that represent the entity object is not guaranteed
    to yield the same result. Therefore, a client should always use the isIdentical method to determine
    if two entity object references refer to the same entity object.
    Note that the use of isIdentical for the comparison of object references applies to the
    implementation of the methods of the java.util.Collection API as well.

  • Compare collection with list of values

    Hi
    oracle 10.2.0.1.0
    I need to compare a collection (Record ) vriable with a list of values from a table .
    pseudo code is
    if gpid_rec.item_type in ('a','b','c') then
    end if ; Now this should be replaced by values retrieved from a table
    if gpid_rec.item_type in ( select item_type from dbom_items ) then
    end if ;But the query is not allowed in if statement .
    please help me in achieving it.

    Hi,
    Something like this
    declare
      type t_values is table of varchar2(1) index by dbom_items.item_type%type;
      v_values  t_values;
    begin
      -- init once
      for cur in (select item_type from dbom_items)
      loop
        v_values(cur.item_type) := '1';
      end loop;
      -- then use many times
      if v_values.exists(gpid_rec.item_type)
      then
      end if;   
    end;
    /

  • Comparing collections

    i have a query result bulk collected into a record type it contains 2 columns
    say columna columnb
    11 2
    22 3
    i want to check this result with a abc.csv file
    now i can read this file through utl_file.open with read option
    it contains values like
    columna columnb
    11 2
    22 3
    how i can check whether the two entries are same or different
    suggestions welcome
    thanks in advance

    The simplest option would be to set up the abc.csv as an external table and then just do a SQL query to compare that to the oracle table.

  • Comparing Collection object with a string

    Hi everyone,
    There is my problem: I have a program that generate all possible combinations of a certain number of letters for example: -ABC- will gives A, B, C, AB, AC, BC, ABC. Everything is fine at this point. But then the user can input a string like "AB" and I have to tell him if this string is contained in the generated set. My set is in a Collection, but when I used : LetterCombination.Contains(TextString), it returns always false. Even if I know that the string is contained in the set.
    Here is the code to generate the set:
    public class Recursion
         Collection LetterCombination;
    /*String Letters is the letters which I have to generate the combination, and
    the LetterNumber is the number of letters contained in my string.*/
         public Recursion(Set ItemLetters, String Letters, int LetterNumbers)
              ItemLetters = new TreeSet();
    String[] Token = Letters.split(" ");
    /*Adding the letters in the TreeSet*/
    for (int i = 0; i < LetterNumbers; i++)
         ItemLetters.add(Token);
    LetterCombination = BuildLetterSet(ItemLetters);
    private Collection BuildLetterSet(Set ItemLetters)
    Set NotUsedYet = new TreeSet();
    Set thisPowerSet = new TreeSet();
    Collection Letterresult = new ArrayList();
    NotUsedYet.addAll(ItemLetters);
    BuildByRecursion(NotUsedYet, thisPowerSet, Letterresult);
    return Letterresult;
    private void BuildByRecursion(Set notUsedYet, Set thisPowerSet, Collection result)
    if(notUsedYet.isEmpty())
    if(!thisPowerSet.isEmpty())
    Set copy = new TreeSet();
    copy.addAll(thisPowerSet);
    result.add(copy);
    return;
    Object item = notUsedYet.iterator().next();
    notUsedYet.remove(item);
    BuildByRecursion(notUsedYet, thisPowerSet, result);
    thisPowerSet.add(item);
    BuildByRecursion(notUsedYet, thisPowerSet, result);
    thisPowerSet.remove(item);
    notUsedYet.add(item);
    And if I print out the LetterCombination collection, it gives me:
    [C]
    [B, C]
    [A]
    [A, C]
    [A, B]
    [A, B, C]
    Which are the good combination needed. But I really don't understand how to compare this collection with the string entered by the user.
    I'm really lost. can somebody help me! Thanks in advance...

    You don't show where you call this constructor, or what your arguments are:
    public Recursion(Set ItemLetters, String Letters, int LetterNumbers)
       ItemLetters = new TreeSet();
       String[] Token = Letters.split(" ");
       /*Adding the letters in the TreeSet*/
       for (int i = 0; i < LetterNumbers; i++)
          ItemLetters.add(Token[ i ]);
       LetterCombination = BuildLetterSet(ItemLetters);
    }But, the constructor doesn't make sense, anyway. itemLetters is immediately set to a new TreeSet, so whatever you passed in (if anything) for the first argument is unchanged by the constructor (and the new TreeSet is lost when you finish the constructor). Also, you split your input Letters on space, but rely on LetterNumbers for the length of the split array (which may or may not be accurate). Why not do a 'for' loop testing for "i < Token.length", and eliminate LetterNumbers parameter? Your input for the second parameter to this constructor would have to be "A B C D" (some letters delimited by spaces). Your constructor only needs one parameter--that String.
    The capitalization of your variables doesn't follow standard coding conventions. Your code is hard to read without the "code" formatting tags (see "Formatting Tips"/ [ code ] button above message posting box).

  • SQl Server - cant compare with values in table field have nchar as datatype

    Hello all!
    I am using jtds driver to connect with SQL server. My problem is i am saving arabic text into the SQL Server. The fields which contains arabic text have the datatype nchar. I can insert the values by simply placing N before the actual arabic text which i am reading from a file.
    I mean insert into [table] values(N'some arabic text') works fine.
    But when i try to select the values from the table and want to pass some paramerts (in arabic text) in where clause it doesnt return me anything.
    e.g select * from [table] where [column(nchar type)] = N'arabic text(read from file)' return nothing. Result set is always empty.
    Queryis fine as i printed the query in seperate file and run it on Query analyzer which gives me the right results.
    Any suggestions?? Please i am dying conditions tell me any solutions immediately
    Regards,
    Alam sher

    String url = "............";
    Properties props = new Properties();
    props.put("charset","cp1256");
    Connection con = DriverManager.getConnection(url,props);now this way if i get the resultset it would return me the expected resultset:)
    To compare an arabic word against the values in result set one also has to convert it into cp1256 encoding line this.
    new String([arabic word].getBytes(), "cp1256");
    The prolem was not to print the arabic words on console basically. No doubt on console it would print ???? as it doesnot support this encoding. Originial issu was comparing a string containig the arabic text with the values returned by the result set.
    This was the solution i could figure out and its working.
    Thanks anyways.
    Regards,
    Alam Sher

  • Cant compare strings

    I tried using the .equals() method, and...
    org.apache.jasper.JasperException: An exception occurred processing JSP page /aprilplans.jsp at line 13
    10:      BufferedReader pash = new BufferedReader(objFr);
    11:      String pas = "";
    12:      while ((pas = pash.readLine()) != null) {
    13:      if(pass.equals(pas))
    14:           {%>
    15: <html>
    16: <head>
    Stacktrace:
         org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:524)
         org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:435)
         org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
         org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    root cause
    java.lang.NullPointerException
         org.apache.jsp.aprilplans_jsp._jspService(aprilplans_jsp.java:72)
         org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
         org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
         org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
         org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
         javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    what do i need to do here?????????????????????????????????????????????????????????

    I'm guessing that pass is null. Now you have to figure out why.

  • How can I compare two collections at the same time? (View two grid views)

    I have two collections containing some of the same images. (My Nikon D70 did not put an end-of-file on some images. I recovered them into a different collection.) Now I want to display both collections side-by-side in grid view. I will select those images in the "recovered" collection that correspond to the bad images in the "main" collection, add the ratings etc, and move just these to another collection.
    It is extremely frustrating to have to bounce back and forth between collections, remembering each image one by one and selecting it in the "recovered" collection. (The image names are not preserved in the "recovered" collection -- I have to go by what the image looks like.)
    LightRoom allows me to compare photos in the compare view. I want to compare collections in two grid views.

    CaptureTheLight,
    you have ran into a situation when you have to compare two sets of images and now you're wondering how come Lightroom doesn't have such "obviously necessary" functionality? But you have to admit it, this is not such a common situation in a photographer's workflow recovers broken files and tries to compare them against themselves. I think it's a pretty specific feature you need. Still, Lightroom has enough powerful tools for editing and sorting images.
    For example...
    You could just put them all - "main" and "recovered" - into a single collection or into the Quick Collection. Label the entire "recovered" collection with, say, red and sort by capture time. Now you'll have everything side by side, ordered chronologically. The "recovered" images will stay next to the "main" images since their capture time will be the same, and they will also stand out since they have the red label.
    Make the thumbnails bigger and set up the grid view so it tints the thumbnail cell are tinted with the label color. Now, you can go quickly through them visually checking labeled vs unlabeled.

  • How to compare a collection of objects?

    Basically I am checking answers to security questions.
    So I have an id, a question no and the answer_text stored in a table.
    What I intend to do is retrieve this into a collection and compare that to the collection passed in.
    If they match , I return true else I return false.
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
    PL/SQL Release 11.2.0.1.0 - Production
    CORE 11.2.0.1.0 Production
    TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
    NLSRTL Version 11.2.0.1.0 - Production
    referencing this thread on collections
    Re: Compare Collections   - PL-00306
    I based my example on TUBBY's example.
    create or replace
    type answer_array_obj
    as
    object(id number,
              question_no number,
              answer_text varchar2(100)
    create or replace type answer_array as table of answer_array_obj;
    DECLARE
    first_list  answer_array_type := answer_array_type(answer_array_obj(1,1,'ONE'),
                                                                             answer_array_obj(1,2,'TWO'),
                                                                             answer_array_obj(1,3,'THREE')
    second_list  answer_array_type := answer_array_type(answer_array_obj(1,1,'ONE'),
                                                                             answer_array_obj(1,2,'TWO'),
                                                                             answer_array_obj(1,3,'THREE')
    compare_list answer_array_type := answer_array_type(NULL);
    BEGIN
    compare_list := first_list  MULTISET EXCEPT second_list;
    IF compare_list.COUNT = 0
    THEN
        compare_list := second_list MULTISET EXCEPT first_list;
    END IF;
    IF compare_list.COUNT = 0
    THEN
        DBMS_OUTPUT.PUT_LINE('EQUAL');
    ELSE
       DBMS_OUTPUT.PUT_LINE('THE ABSENCE OF EQUALITY');
    END IF;
    END;
    /When I looked at the example , by user 933207, he appeared to be using two different objects.
    18 BEGIN
    19 load1( nt_copy1);
    20 load2( nt_copy2);

    Hi,
    what is the question? I doesnt work? So you have to provide a map method
    CREATE OR REPLACE TYPE  "ANSWER_ARRAY_OBJ"
    as
    object(id number,
              question_no number,
              answer_text varchar2(100),
              MAP MEMBER FUNCTION match RETURN VARCHAR2);
    CREATE OR REPLACE TYPE BODY  "ANSWER_ARRAY_OBJ"
    as
              MAP MEMBER FUNCTION match RETURN VARCHAR2 is
              begin
                return to_char(id)||to_char(question_no)||answer_text;
              end;
    end;
    create or replace type answer_array_type as table of answer_array_obj;
    DECLARE
    first_list  answer_array_type := answer_array_type(answer_array_obj(1,1,'ONE'),
                                                                             answer_array_obj(1,2,'TWO'),
                                                                             answer_array_obj(1,3,'THREE')
    second_list  answer_array_type := answer_array_type(answer_array_obj(1,1,'ONE'),
                                                                             answer_array_obj(1,2,'TWO'),
                                                                             answer_array_obj(1,3,'FOUR')
    compare_list answer_array_type := answer_array_type(NULL);
    BEGIN
    compare_list := first_list  MULTISET EXCEPT second_list;
    IF compare_list.COUNT = 0
    THEN
        compare_list := second_list MULTISET EXCEPT first_list;
    END IF;
    IF compare_list.COUNT = 0
    THEN
        DBMS_OUTPUT.PUT_LINE('EQUAL');
    ELSE
       DBMS_OUTPUT.PUT_LINE('THE ABSENCE OF EQUALITY');
    END IF;
    END;
    THE ABSENCE OF EQUALITY
    Statement processed.
    0.02 secondsregards

  • Error in proposed Collections.sort signature

    (A very long time ago I've send a note on this to the jsr comment list, but unfortunately I never got a reply nor did I notice a bug report. Therefore I propose the change again here).
    The signature of the Collections.sort method is very limiting:
      static <T> void sort(List<T> list, Comparator<T> c);This signature requires you to pass a Comparator that is parameterized with exactly the same type as the items in the List. However, often Comparators can be implemented more generic. The signature doesn't allow this. The only requirement for the sort algorithm is however to pass a Comparator that is able to compare the items in the List.
    This requirement is expressed by the following signature:
      static <T, E extends T> void sort(List<E> list, Comparator<T> comparator) The items in the List are now allowed to be more specific. Because I don't want to cast in Generic Java code I've implemented a tiny workaround:
      public static <T, E extends T> void sort(List<E> list, Comparator<T> comparator) {
        Collections.sort(list, new ComparatorWrapper<T, E>(comparator));
      private static class ComparatorWrapper<T, E extends T> implements Comparator<E> {
        private Comparator<T> _comparator;
        public ComparatorWrapper(Comparator<T> comparator) {
          super();
          _comparator = comparator;
        public int compare(E o1, E o2) {
          return _comparator.compare(o1, o2);
      }This proves the correctness of the new signature. This also proves that you have to be very careful in chosing a signature. I've been working with Generic Java for some years now, but I'm still making the same mistake now and then ...

    This will be fixed in a novel and interesting way in the new spec for GJ -- stay tuned! (I think mid-May/late-May is the expected timeframe for this.)

  • Comparing the creation time of two jars.

    Hi,
    My requirement is that i need to compare the creation time of two of the jars and see which one of the jar is the latest.
    I did it using the following code i get the output in the form of strings so i cant compare them to find which one is the latest.
    import java.io.*;
    import java.util.*;
    public class FileTest {
         public static void main(String args[]) {
              File devbuild = new File(
                        "\\\\devspace\\dev$\\ReleaseEng\\DEVbuilds\\tw_enterprise\\build\\jboss\\Oracle\\Twelibrary.jar");
              File local = new File(
                        "D:\\jboss-4.2.1.GA\\server\\TWEServer\\Twelibrary.jar");
              Calendar now = Calendar.getInstance();
              int currtime = now.get(Calendar.HOUR_OF_DAY);
              int maxtime = 18;
              System.out.println("Before the while loop");
              while (currtime < maxtime) {
                   System.out.println("Inside the while loop");
                   if (devbuild.exists()) {
                        try {
                             // get runtime environment and execute child process
                             Runtime systemShell = Runtime.getRuntime();
                             BufferedReader br1 = new BufferedReader(
                                       new InputStreamReader(new FileInputStream(devbuild)));
                             BufferedReader br2 = new BufferedReader(
                                       new InputStreamReader(new FileInputStream(local)));
                             Process output = systemShell.exec("cmd /c dir " + devbuild);
                             Process output1 = systemShell.exec("cmd /c dir " + local);
                             // open reader to get output from process
                             BufferedReader br = new BufferedReader(
                                       new InputStreamReader(output.getInputStream()));
                             BufferedReader br3 = new BufferedReader(
                                       new InputStreamReader(output1.getInputStream()));
                             String out = "";
                             String out1 = "";
                             String line = null;
                             String line1 = null;
                             int step = 1;
                             int step1 = 2;
                             while ((line = br.readLine()) != null) {
                                  if (step == 6) {
                                       out = line;
                                  step++;
                             } // display process output
                             while ((line1 = br3.readLine()) != null) {
                                  if (step1 == 6) {
                                       out1 = line1;
                                  step1++;
                             try {
                                  out = out.replaceAll(" ", "");
                                  out1 = out1.replaceAll(" ", "");
                                  System.out.println("CreationDate: "
                                            + out.substring(0, 10));
                                  System.out.println("CreationTime: "
                                            + out.substring(10, 16) + "m");
                                  System.out.println("CreationDate: "
                                            + out1.substring(0, 10));
                                  System.out.println("CreationTime: "
                                            + out1.substring(10, 16) + "m");
                             } catch (StringIndexOutOfBoundsException se) {
                                  System.out.println("File not found");
                             //Long modifiedtime = devbuild.lastModified();
                             //long oldtime = old.lastModified();
                             int devbuilddate = Integer.parseInt(out.substring(0, 10));
                             int devbuildtime = Integer.parseInt(out.substring(10, 16));
                             int localbuilddate = Integer.parseInt(out1.substring(0, 10));
                             int localbuildtime = Integer.parseInt(out1.substring(10, 16));
                             if (devbuilddate >= localbuilddate && devbuildtime >= localbuildtime) {
                                  System.out.println("The Build date is Later than the one i am having--->");
                                  System.exit(6);
                             } else {
                                  System.exit(0);
                        } catch (Exception e) {
                             e.printStackTrace();
                   if (currtime > maxtime) {
                        System.exit(5);
    How can i do it?
    Can anyone help me out in this.
    Thanks,
    Kavipriya.

    Hi Clap,
    Thanks for ur reply. Let me say you the scenario clearly. We are in the process of automating some of the process. We have builds running daily night and our automation will run using that build.
    Currently the build which is getting generated does have manifest in it. For our automation framework we cant suggest adding the manifest. Which will not be agreed.
    Our automation will be checking till 10.am. to check whether the build is ready if not it will come out of the loop. If the build is avaialble within 10 then it will take the build and see whetehr the creation date and time of the build and the one i am having locally or different. If diff it will see whether the build generated is latest than the one i am having.
    If it so then the process will run.
    So hope you got my issue.

  • Duplicate records in a collection

    Hi Experts,
    Just now I've seen a thread related to finding duplicate records in a collection. I understand that it is not advisable to sort/filter data in a collection.
    (https://forums.oracle.com/thread/2584168)
    Just for curiosity I tried to display duplicate records in a collection. Please Please .. this is just for practice purpose only. Below is the rough code which I wrote.
    I'm aware of one way - can be handled effectively by passing data into a global temporary table and display the duplicate/unique records.
    Can you please let me know if there is any other efficient wayto do this.
    declare
      type emp_rec is record ( ename varchar2(40), empno number);
      l_emp_rec emp_rec; 
      type emp_tab is table of l_emp_rec%type index by binary_integer;
      l_emp_tab emp_tab;
      l_dup_tab emp_tab;
      l_cnt number;
      n number :=1;
    begin
    -- Assigning values to Associative array
      l_emp_tab(1).ename := 'suri';
      l_emp_tab(1).empno := 1;
      l_emp_tab(2).ename := 'surya';
      l_emp_tab(2).empno := 2;
      l_emp_tab(3).ename := 'suri';
      l_emp_tab(3).empno := 1;
    -- Comparing collection for duplicate records
    for i in l_emp_tab.first..l_emp_tab.last
    loop
        l_cnt :=0;  
    for j in l_emp_tab.first..l_emp_tab.last 
        loop      
           if l_emp_tab(i).empno  =  l_emp_tab(j).empno and l_emp_tab(i).ename  =  l_emp_tab(j).ename then
               l_cnt := l_cnt+1;          
                   if l_cnt >=2 then
                      l_dup_tab(n):= l_emp_tab(i);
                   end if;
           end if;                   
        end loop;  
    end loop;
    -- Displaying duplicate records
    for i in l_dup_tab.first..l_dup_tab.last
    loop
       dbms_output.put_line(l_dup_tab(i).ename||'  '||l_dup_tab(i).empno);
    end loop;
    end;
    Cheers,
    Suri

    Dunno if this is either easier or more efficient but it is different.  The biggest disadvantage to this technique is that you have extraneous database objects (a table) to keep track of.  The advantage is that you can use SQL to perform the difference checks easily.
    Create 2 global temporary tables with the structure you need, load them, and use set operators (UNION [ALL], INTERSECT, MINUS) to find the differences.  Or, create 1 GTT with an extra column identifying the set and use the extra column to identify the set records you need.

  • ITunes cant import WMA files

    Windows Media Audio files cant be imported into iTunes. I bought a Olympus Digital audio recorder WS-100 and it seems to be one of the only models that works on a Mac, but I cant import the audio to iTUnes and I cant burn them to audio CD's that 99.9% of the world can read.
    is there a way?

    Maybe I'll stick with tapes. What a pain.. I have to buy software that costs about $30 just to burn a CD from my digital recorder. Nah I'll stay with tapes.
    Got any digital recorders that record into a non WMA format? Dont reccommend me a iPod accessory, as the features are lacking compared to a standalone digital recorder.
    My Zire 72 records into a WAVE format, but the audio quality cant compare to a standalone digital recorder.
    Besides I can get more audio on a tape than on a CD and I have a ton of them left.
    Perhaps I'll just stay with tapes. What a shame that I have to spend $30 just to import the audio into iTunes so I can burn a CD.
    John
    Message was edited by: John Wolf

  • Sorting the Excel-way for Collections : Is it possible ?

    Hi all,
    I'm having a Collection of Objects containing multiple data-types. Now I'm trying to sort on a given data-type and when there are multiple occurences of this type, I should sort on a secundary type, and so one.
    You could look at this as sorting in Excel on column A, then on column B and finaly on column C.
    Unfortunately it can't be done on the database-side and should be done with the code.
    Any tips, links, code-snippets that could help would be extremely appreciated.
    Thanks.

    [url http://java.sun.com/j2se/1.4.1/docs/api/java/util/Collections.html#sort(java.util.List,%20java.util.Comparator)]Collections.sort(List, Comparator)
    [url http://java.sun.com/j2se/1.4.1/docs/api/java/util/Comparator.html]Comparator

  • Problem with Equals/Contains

    Hello,
    I am learning .net c# and i wanted to rewrite Stack collection.
    But when i tried rewriting Contains method, i think i found little bug.
    I cant compare two instances of class.
    I created class Test and i put it into stack, then i made new instance of class Test and i tried do Contains, how i found out it always returns False. Same is with Equals, ReferenceEquals and ==. Why is this happening? Both classes contains same items with
    same things. Why it isnt True?
    Thanks for answer.

    Comparison and equality are one of the things that are done in an strange way in .NET.
    First thing to pay attention is that, there is difference between equality comparison and less than/greater than comparison. On the whole, equality is used in searching and looking up while comparison is used in sorting. Equality comparison is always doable.
    You compare whether two things are equal. But less than/greater than might not necessarily possible in all situations.
    There are also two general ways when comparing two things (whether for equality or less than/greater than):
    Objects themselves perform comparison on each other
    Another object -and external object- performs comparison on them
    In first approach, we call the Equals() method an object, passing it the other object we intend to compare its equality with, and the former object performs equality comparison himself and sees whether it is equal to the given object or not. While Equals()
    method provides us a good point to override comparison, the limitation is that, we can override Equals() only once in a class, while there might be different equality contexts available for comparison.
    For example in a collection of Person objects, one time we might compare equality based on Lastname and another time we might want to do it based on Birthdate. Using Equals() method regretfully gives us an only chance for comparison. Also, it corrupts the
    equality rule of all of our objects. Apparently we don't want to change the equality algorithm of our objects, one of which is equality comparison based on reference that is done intrinsically by object base class. Also, what if we don't access to the source
    code of the class we are using its instances in our application?! Let's not think about such a frightening situation (in that case, inheritance is an ultimate shot, however, not the only shot, as we will see soon). This leads us to the other approach.
    In the second approach we use another object as a judge that performs comparison (whether it be equality or less than/greater than) and proclaims the result. Because the judge object is external and can be any object, we will potentially have numerous
    choices at hand to use for comparison. One time we might use a LastNameEqualityComparer object, another time use a BirthdateEqualityComparer and another time use whatever equality comparer we want. We have total freedom.
    Now, we get to the point where I said there is strange or anomaly behavior in .NET collections regarding comparison.
    Some collections such as Dictionary<TKey, TValue> provides us a way to pass them an equality comparer object in their constructors when we are creating an instance of them.
    public Dictionary(IEqualityComparer<TKey> comparer)
    exmaple: https://msdn.microsoft.com/en-us/library/ms132072(v=vs.110).aspx
    public class Example
    public static void Main()
    // Create a new Dictionary of strings, with string keys
    // and a case-insensitive comparer for the current culture.
    Dictionary<string, string> openWith =
    new Dictionary<string, string>(
    StringComparer.CurrentCultureIgnoreCase);
    // Add some elements to the dictionary.
    openWith.Add("txt", "notepad.exe");
    openWith.Add("bmp", "paint.exe");
    openWith.Add("DIB", "paint.exe");
    openWith.Add("rtf", "wordpad.exe");
    // Try to add a fifth element with a key that is the same
    // except for case; this would be allowed with the default
    // comparer.
    try
    openWith.Add("BMP", "paint.exe");
    catch (ArgumentException)
    Console.WriteLine("\nBMP is already in the dictionary.");
    // List the contents of the sorted dictionary.
    Console.WriteLine();
    foreach( KeyValuePair<string, string> kvp in openWith )
    Console.WriteLine("Key = {0}, Value = {1}", kvp.Key,
    kvp.Value);
    But some collections don't provides us a way in their constructors to pass them a custom comparer. Unfortunately your case, Stack, is among them and Stack doesn't have such a constructor.
    If we read the MSDN documentation of the Contains() method in the non-generic Stack, and generic Stack<T> classes, we get the following sayings that reveals everything:
    non-generic Stack.Contains(): this method determines equality by calling Object.Equals.
    generic Stack<T>.Contains(): this method determines equality using the default equality comparer EqualityComparer<T>.Default for T, the type of values in the list.
    If we use a non-generic Stack class, our only choice is overriding Equals() in the class of our object, as Andy ONeill mentioned before. But if we use non-generic Stack<T>, .NET team generously favored us one other tiny choice. We can implement the
    IEquatable<T> interface in our class that has an Equals() method and implement the algorithm of our new equality comparison in this Equals() method. Why we should do that? Because that is what EqualityComparer<T>.Default does! See MSDN documentation
    again:
    https://msdn.microsoft.com/en-us/library/ms224763(v=vs.110).aspx
    The Default property
    checks whether type T implements
    the System.IEquatable<T> interface
    and, if so, returns an EqualityComparer<T> that
    uses that implementation. Otherwise, it returns an EqualityComparer<T> that
    uses the overrides of Object.Equals and Object.GetHashCode provided
    by T.
    Although this explanation is a little misleading or vague, simply put it says, the Default property returns a comparer object that checks whether the objects being compared have implemented IEquatable<T> interface or not. If so, it uses the implemented
    Equals() of that interface in the objects, otherwise it resorts to the intrinsic Equals() method that is inherited to all objects from the object, father of all, base type.
    This IEqualityComparer<T>.Default object and that IEquatable<T> interface together help not to corrupt the innate Equals() methods of our classes.
    However, as good as what .NET team might have thought by favoring us using an IEqualityComparer<T>.Default in the Contains() method of the non-generic Stack<T> class, their solution is far from what is expected. Because again it stucks us to
    the first problem. We have only one and only one chance to define an equality comparison algorithm in our class. Naturally we can't implement an IEquatable<T> interface multiple times in our class.
    The tiny problem is that, they missed adding a new constructor in Stack<T> class that accepts an IEqualityComparer<T> like what they have done in Dictionary<TKey, TValue>. This is a shame. Because this is not a rare occasion. The same is
    true for some other collections such as Queue<T>, HashSet<T>, LinkedList<T> and List<T>. I don't know whether they have did this intentionally or they simply forgot to do that.
    So what? What should we do if we had multiple equality testing algorithms.
    Fortunatey there is still hope.
    If .NET team working on generic collections were that lazy to forget adding new constructors to generic classes, they did a good job and solved the problem from the root by adding a bunch of extension methods to all IEnumerable, IEnumerable<T> collections
    in System.Linq namspace and freed themselves forever. Look at the following extension methods in System.Linq namespace:
    public static bool Contains<TSource>(
    this IEnumerable<TSource> source,
    TSource value,
    IEqualityComparer<TSource> comparer
    You got the idea? They defined a general Contains() method for any IEnumerable<T> collection that allows us to give it a custom equality comparer object. Hooray! Problem solved. But wait. Why should we be happy? That comparer parameter might still
    use IEquatable<T> and presumes the objects have an Equals() method! Oh my gush! Still returned to the same point and the problem exists. We stuck forever! Don't freak out. Be calm.
    The IEqualityComparer<T> interface is defined this way:
    public interface IEqualityComparer<in T>
    bool Equals(T x, T y);
    int GetHashCode(T obj);
    It says, an equality comparer should have an Equals() method and it is in this very method that the equality comparison algorithm will go. This method receives two objects and compares them together using whatever algorithm the creator of the equality comparer
    class has intended.
    The good point of this IEqualityComparer<T> and that Contains<T>() extension method is that, your objects are not expected to implement an IEquatable<T> as well. This is another good news. Because we are neither forced to override
    Equals() in our class and corrupt it, nor we have to implement IEquatable<T> in them. In fact, our classes remain clean and intact and we even don't have to have their source code.
    So, this was the final cure for the malignant issue of equality comparison. The same story is true for less than/greater than comparison.
    In conclusion, what I recommend is that, never override the intrinsic Equals() method, inherited from Object, in your classes. Instead use the extension methods that has a comparer parameter in their signature and receive a comparer object (like Contains<T>()).
    I don't want to again raise a depression air here. But you should know that. You have the right. All extension methods does not have an overload that has a comparer parameter. But don't worry. You can yourself write the required extension method you need and
    complete the probably incomplete work in .NET.
    Good luck

Maybe you are looking for

  • Xbox HD DVD Player

    I'm thinking about buying the Xbox HD DVD Player. I want to connect this with my Macbook and than over my DVI Hdmi cable to my projector. Is the Macbook graphics card a HDCP card? Do you think the qualti will be good or it get lost in the connection?

  • Compiz with HD 2400 XT ATI card

    compiz is not starting and falling into white screen. Trouble shooting and also trying various options in xorg.conf/without xorg.conf did not help. This card is in Acer 4920G laptop.Driver is open source xf86-video-ati. compiz --replace ccp & emerald

  • Data transfer from one crm system (Prod) to another crm system ( quality)

    Hi,   I have a requirement in which i have to transfer a set of data ( BP, Product, Sales Order etc) for a given date range from production system to Quality system. I am more concerned abt the Business documents which move from CRM to ERP. I thought

  • HT1660 How do i get all the songs from 1 album to appear as 1 album instead of 3 albums because they feature guest artists

    How do i get all the songs from 1 album to appear as 1 album instead of 3 albums because 2 of the songs feature guest artists in my itunes library?

  • Need Help on Payroll PCR

    Dear Experts I need help for writing a PCR for payroll. I have stored A calculation amount in Temp1 and B calculation amount in Temp2. Now I need to find out which Temp amount having lesser amount. Once I found lesser amount then I need to add anothe