如何将 Linq var 转换为 List

Posted

技术标签:

【中文标题】如何将 Linq var 转换为 List【英文标题】:How can i convert Linq var to List 【发布时间】:2013-02-27 18:20:29 【问题描述】:

我正在尝试将 Linq var 转换为 List.my c# 代码是

private List<HyperlinkInfo> GetHyperlinkByCode()

        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = new List<HyperlinkInfo>();
        lst = obj.GetAllHyperlink();
        //lst = lst.Select(x => x.Attraction).ToList();
        var k = lst.Select(x => x.Attraction).Distinct();            

如果你查看上面的代码直到 Line var k = lst.Select(x =&gt; x.Attraction).Distinct(); 是好的 现在我可以将 var k 转换为 List。

【问题讨论】:

HyperLinkInfo的属性是什么? 【参考方案1】:

根据您的 cmets,您需要为每个 Attraction 值(即字符串)提供一个 HyperlinInfo 对象。所以,使用分组和ToList()

private List<HyperlinkInfo> GetHyperlinkByCode()

        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = obj.GetAllHyperlink();
        return lst.GroupBy(x => x.Attraction) // group links by attraction
                  .Select(g => g.First()) // select first link from each group
                  .ToList(); // convert result to list

您也可以使用morelinq DistinctBy 扩展(可从 NuGet 获得):

private List<HyperlinkInfo> GetHyperlinkByCode()

        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = obj.GetAllHyperlink();
        return lst.DistinctBy(x => x.Attraction).ToList();

【讨论】:

【参考方案2】:

使用Enumerable.ToList&lt;TSource&gt; Method。只需在查询末尾添加ToList()

return k.ToList();

所以你的方法可以是:

private List<HyperlinkInfo> GetHyperlinkByCode()

        TourInfoBusiness obj = new TourInfoBusiness();
        List<HyperlinkInfo> lst = new List<HyperlinkInfo>();
        lst = obj.GetAllHyperlink();
        //lst = lst.Select(x => x.Attraction).ToList();
        var k = lst.Select(x => x.Attraction).Distinct();
        return k.ToList();

但是x.Attraction 应该是HyperLinkInfo 类型的对象。

编辑:根据评论,x.Attraction 似乎是一个字符串,您需要在 select 语句中创建您的类 Project.Bll.HyperlinkInfo 的对象,然后返回该列表。比如:

var k = lst.Select(new Project.Bll.HyperLinkInfo(x => x.Attraction)).Distinct();

假设Project.Bll.HyperlinkInfo 构造函数采用字符串参数返回HyperLinkInfo 对象。

【讨论】:

它不起作用..错误消息是“错误 8 无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List' @KartikPatel,查看编辑部分,需要选择HyperLinkInfo类型对象。 仍然无法正常工作,并且 x.Attraction 是 HyperLinkInfo 类型对象的一部分。【参考方案3】:

使用这个:

var k = lst.Select(x => x.Attraction).Distinct().ToList();

现在kx.Attraction 类型的列表。如果您的 x.Attractionstring,请使用:

List<string> k = lst.Select(x => x.Attraction).Distinct().ToList();

【讨论】:

不工作...出现类似...无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List' 我必须返回 HyperLinkInfo 的对象。我不能使用 List @KartikPatel 您选择了x.Attraction,它是字符串。您想如何将string 转换为HyperLinkInfo【参考方案4】:

在查询中使用ToList()

IEnumerable&lt;T&gt; 创建一个List&lt;T&gt;

List<HyperlinkInfo> k = lst.Select(x => x.Attraction).Distinct().ToList();

【讨论】:

不工作....出现错误,例如无法将类型 'System.Collections.Generic.List' 隐式转换为 'System.Collections.Generic.List '【参考方案5】:

试试这个添加 DistinctBy of moreLinq:

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)

    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    
        if (seenKeys.Add(keySelector(element)))
        
            yield return element;
        
    

并在您的代码中调用它:

lst.DistinctBy(x => x.Attraction).toList();

【讨论】:

【参考方案6】:

试试这个代码:

return (List<Hyperlink Info>) k

【讨论】:

以上是关于如何将 Linq var 转换为 List的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 LINQ 将 List<string> 中的所有字符串转换为小写?

使用 LINQ 将 List<U> 转换为 List<T>

无法将“Newtonsoft.Json.Linq.JArray”类型的对象转换为“System.Collections.Generic.List”类型

转载C#使用ToList()将数组快速转换为List集合

如何将DataTable转换成List<T>

泛型类型上的 Linq 类型转换