如何将Linq中的变量转换为列表?

3

我想将Linq var转换为List。我的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();            
}

如果您查看上面的代码直到变量 k = lst.Select(x => x.Attraction).Distinct();,现在可以将变量 k 转换为 List。


HyperLinkInfo类有哪些属性? - John Woo
6个回答

6
根据您的评论,您需要为每个“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
}

此外,您还可以使用morelinqDistinctBy扩展(可从NuGet获取),以实现去重功能:

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

5
使用Enumerable.ToList<TSource> 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是一个字符串,你需要在选择语句中创建你的类Project.Bll.HyperlinkInfo的对象,然后返回该列表。例如:

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

假设Project.Bll.HyperlinkInfo构造函数需要一个字符串类型的参数以返回一个HyperLinkInfo对象。

无法工作。错误信息为“错误8:无法隐式转换类型'System.Collections.Generic.List<string>'到'System.Collections.Generic.List<Project.Bll.HyperlinkInfo>'”。 - Kartik Patel
@KartikPatel,请检查编辑部分,您需要选择“HyperLinkInfo”类型的对象。 - Habib
仍然无法工作,x.Attraction是HyperLinkInfo类型对象的一部分。 - Kartik Patel

2

使用这个:

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

现在,k 是一个由 x.Attraction 类型构成的列表。如果你的 x.Attraction 是一个字符串,请使用以下代码:
List<string> k = lst.Select(x => x.Attraction).Distinct().ToList();

无法工作...出现错误,如下所示...无法隐式转换类型“System.Collections.Generic.List<string>”为“System.Collections.Generic.List<Project.Bll.HyperlinkInfo>”。 - Kartik Patel
我必须返回HyperLinkInfo对象。我不能使用List<string>。 - Kartik Patel
@KartikPatel,您选择了x.Attraction,它是一个字符串。您想如何将string转换为HyperLinkInfo - Hamlet Hakobyan

0

在查询中使用ToList();

IEnumerable<T>创建一个List<T>

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

不起作用...出现错误,如无法隐式转换类型 'System.Collections.Generic.List<string>' 为 'System.Collections.Generic.List<Project.Bll.HyperlinkInfo>'。 - Kartik Patel

0

尝试这段代码:

return (List<Hyperlink Info>) k

0

试试这个添加moreLinq的DistinctBy方法:

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接