1

だから私は以下のlinqステートメントに固執しています。

        public void ReturnHire(string carregistration, string hirefromdate, string hiretodate)
        {
            var result = customermembers.Where(c => c.CustomerCarType.Where(n => String.Equals(n.CarRegistration, carregistration)).FirstOrDefault(); // this line
            if (result != null)
            {
                customermembers.ForEach(c => c.CustomerHireDate.RemoveAll(cs => cs.HireFromDate == hirefromdate && cs.HireToDate == hiretodate));
                customermembers.ForEach(c => c.CustomerCarType.RemoveAll(cs => cs.CarRegistration == carregistration));
            }
        }

私のxmlは次のようになります:

<ArrayOfCustomer>
    <Customer>
        <CustomerID>1</CustomerID>
        <FirstName>G</FirstName>
        <LastName>Graam</LastName>
        <Age>27</Age>
        <CustomerHireDate>
            <HireDate>
                <HireFromDate>15.07.2012</HireFromDate>
                <HireToDate>29.07.2012</HireToDate>
            </HireDate>
        </CustomerHireDate>
        <CustomerCarType>
            <CarType>
                <CarRegistration>IAWB-OOTO</CarRegistration>
            </CarType>
        </CustomerCarType>
    </Customer>
</ArrayOfCustomer>

私のクライアント側では、顧客は車両を「返却」する必要があります。私にとってこれは基本的に、日付の前後に雇用を削除し、顧客内から登録番号を削除することです. しかし、これは登録番号だけでこの削除を行わなければならないキャッチです。そのため、where 句内で where を実行しようとしましたが、暗黙的に CarType を bool に変換できないと表示されます。

私の Web サービスには次のリストがあります。

        List<Customer> customermembers = new List<Customer>();
        List<HireDate> hiredates = new List<HireDate>();
        List<CarType> cartypes = new List<CarType>();

ちょうどcustomermembers where customer car type where rehistration number equals mystring良かったかな?と思いました。

4

1 に答える 1

1

実際には if ブロックで使用しないためresult、次のようにすることができます。

    public void ReturnHire(string carregistration, string hirefromdate, string hiretodate) 
    { 
        if (customermembers.Any(c => c.CustomerCarType.Any(n => String.Equals(n.CarRegistration, carregistration)))
        { 
            customermembers.ForEach(c => c.CustomerHireDate.RemoveAll(cs => cs.HireFromDate == hirefromdate && cs.HireToDate == hiretodate)); 
            customermembers.ForEach(c => c.CustomerCarType.RemoveAll(cs => cs.CarRegistration == carregistration)); 
        } 
    } 

Any述語を満たす要素が少なくとも 1 つある場合、true を返します。

ただし、リストを 3 回繰り返しているため、これはあまり効率的ではありません。一度だけ繰り返す必要があります。例を投稿しますが、コードにバグがあると思いますので、繰り返したくありません。同じ Hirefromdate と Hiretodate を持つ別々の登録を持つ別々の顧客を検討してください。あなたのコードは、まだ車を返却していない顧客から CustomerHireDate を削除します。

resultただし、バグを修正する必要がある if ブロックで使用するつもりだった可能性があります。

    public void ReturnHire(string carregistration, string hirefromdate, string hiretodate) 
    { 
        var result = customermembers.Where(c => c.CustomerCarType.Any(n => String.Equals(n.CarRegistration, carregistration));
        foreach (var customermember in result)
        { 
            customermember.CustomerHireDate.RemoveAll(cs => cs.HireFromDate == hirefromdate && cs.HireToDate == hiretodate); 
            customermember.CustomerCarType.RemoveAll(cs => cs.CarRegistration == carregistration); 
        } 
    }

元のコレクションは変更されないことに注意してください。そのため、フィルター処理されたオブジェクトのセットを取得するには、Where反復する必要があります。result

于 2012-07-26T23:23:47.523 に答える