簡體   English   中英

有沒有辦法在 LINQ 查詢語法中使用 Distinct?

[英]Is there way to use Distinct in LINQ query syntax?

有沒有辦法重寫:

var tbl = ds.TABLES;
var q = from c in tbl
        select c.TABLE_TYPE;
string s = "";
foreach (var item in q.Distinct())
{
    s += "[" + item + "]";
}        
MessageBox.Show(s);

所以 Distinct() 調用在 LINQ 查詢中?

語言集成查詢語法中沒有Distinct()方法語法。 您可以做的最接近的是移動當前呼叫:

var q = (from c in tbl
         select c.TABLE_TYPE).Distinct();

LINQ 中的Distinct擴展方法沒有等效的查詢語法。

有關原因的更多信息,請參閱https://docs.microsoft.com/en-us/archive/blogs/charlie/linq-farm-using-distinct-and-avoiding-lambdas

(from c in tbl select c.TABLE_TYPE).Distinct();

如果在 select 之后放置不同的元素,則 VB 具有此功能。

您可以捕獲 HashSet 並將 where 子句放在 select 之前:

var hs = new HashSet<char>();

from c in "abcabcd"
where hs.Add(c)
select c;

在發現此問題並意識到它不存在時為 LINQ 搜索 Distinct 函數時,我的解決方法是使用 GroupBy()。 明顯的問題是distinct-set 不包含所有數據(假設您有三個字段,但只想區分兩個字段,但缺少最后一個字段的值,但是,再一次,t-sql 中的 DISTINCT工作方式相同)。

LINQ 代碼(因此轉儲):

void Main()
{
    var gt = new GenerateThings();
    var dlist = gt.list();
    dlist.Dump();

    dlist.GroupBy(x => new {x.id, x.cat}).Dump();
}

public class model
{
    public int id {get;set;}
    public int cat {get;set;}
    public int type {get;set;}
}

public class GenerateThings
{
    public List<model>list()
    {
        var dlist = new List<model>();
        dlist.Add(createNew(1, 1, 1));
        dlist.Add(createNew(1, 1, 1));
        dlist.Add(createNew(1, 2, 1));
        dlist.Add(createNew(1, 2, 1));
        dlist.Add(createNew(1, 1, 2));
        dlist.Add(createNew(1, 1, 2));
        dlist.Add(createNew(1, 1, 2));
        return dlist;
    }
    private model createNew(int id, int cat, int type){
        return new model{
            id = id,
            cat = cat,
            type = type
        };
    }
}

LINQ 轉儲結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM