0

請求書明細オブジェクトのリストがあります。

一意の請求書のリストを表示したいので、後で選択した個別の請求書の請求書行を表示できます。

    List<Invoice> returnInvoices = (List<Invoice>)Session["Invoices"];
    var uniqueInvoices = from i in returnInvoices
                           select new
                           {
                               i.InvoiceNo,
                               i.InvoiceDate,
                               i.OrderNo,
                               i.CustomerPO,
                           };
    GridView3.DataSource = uniqueInvoices;
    GridView3.DataBind();

ユニークな結果を返すにはどうすればよいInvoiceNoですか?私はこれを回避するのに本当に苦労しています:(

4

2 に答える 2

4

実際、セッション変数から個別の請求書を取得することを心配する必要はありません。そもそも、なぜそこに重複があるのか​​を心配する必要があります。すでに請求書があるかどうかを確認せずに、どの時点でセッション変数に請求書を追加しますか?

そうは言っても、次のようにIDごとに1つの請求書を選択できます。

var nonUniqueInvoices = from i in returnInvoices
                       select new
                       {
                           i.InvoiceNo,
                           i.InvoiceDate,
                           i.OrderNo,
                           i.CustomerPO,
                       }; // as before
var uniqueInvoices = nonUniqueInvoices
    .GroupBy(i => i.InvoiceNo)
    .Select(g => g.First());
GridView3.Datasource = uniqueInvoices; // as before

これにより、リストで見つかったIDごとに最初の請求書が選択されます。これは最新の重複ではない可能性があります。


IDごとに1つのアイテムではなく、IDのみが必要な場合は、次を使用できます。

var uniqueInvoiceIDs = returnInvoices.Select(i => i.InvoiceNo).Distinct();

これははるかに効率的であるはずです。

于 2012-12-17T16:33:13.010 に答える
0

のカスタムを作成EqualityComparer<Invoice>Enumerable.Distinctます。

public class InvoiceComparer : IEqualityComparer<Invoice>
{
    public bool Equals(Invoice x, Invoice y)
    {
        if (x == null || y == null) return false;
        return x.InvoiceNo == y.InvoiceNo;
    }

    public int GetHashCode(Invoice obj)
    {
        if (obj == null) return int.MinValue;

        return obj.InvoiceNo.GetHashCode();
    }
}

Distinct次に、カスタム比較ツールを使用して結果を取得できます。

List<Invoice> invoices = (List<Invoice>)Session["Invoices"];
IEnumerable<Invoice> uniqueInvoices = invoices.Distinct(new InvoiceComparer());
于 2012-12-17T16:45:16.133 に答える