[英]Linq: using StringComparer with GroupBy/Distinct in query syntax
[英]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
};
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.