0

我使用以下代码通过 Web Api 从 csv 文件中获取项目列表:

private List<Item> items = new List<Item>();

        public ItemRepository()
        {
            string filename = HttpRuntime.AppDomainAppPath + "App_Data\\items.csv";

            var lines = File.ReadAllLines(filename).Skip(1).ToList();

            for (int i = 0; i < lines.Count; i++)
            {
                var line = lines[i];

                var columns = line.Split('$');

                //get rid of newline characters in the middle of data lines
                while (columns.Length < 9)
                {
                    i += 1;
                    line = line.Replace("\n", " ") + lines[i];
                    columns = line.Split('$');
                }

                //Remove Starting and Trailing open quotes from fields
                columns = columns.Select(c => { if (string.IsNullOrEmpty(c) == false) { return c.Substring(1, c.Length - 2); } return string.Empty; }).ToArray();


                var temp = columns[5].Split('|', '>');
                items.Add(new Item()
                {
                    Id = int.Parse(columns[0]),
                    Name = temp[0],
                    Description = columns[2],

                    Photo = columns[7]



                });
            }
        }

项目列表的 Name 属性必须来自其结构如下的列:

Groups>Subgroup>item

因此,我var temp = columns[5].Split('|', '>');在代码中使用“>”之前获取列的第一个元素,在上述情况下是组。这很好用。

但是,我在结果中得到了很多重复。这是因为该列中的其他项目可能是:

(这些是我的 csv 第 9 列中的一些条目 )Groups>Subgroup2>item2,,,Groups>Subgroup3>item4Groups>Subgroup4>item9

一切都以 开头Groups,但我只想得到Groups一次。

因为它是我得到一长串Groups。如何停止重复?

我希望如果列表中的项目与Name“组”一起返回,则不会返回具有该名称的其他项目。如何进行此检查并实施?

4

2 回答 2

1

If you are successfully getting the list of groups, take that list of groups and use LINQ:

var undupedList = dupedList
    .Distinct();

Update: The reason distinct did not work is because your code is requesting not just Name, but also, Description, etc...If you only ask for Name, Distinct() will work.

Update 2: Try this:

//Check whether already exists
if((var match = items.Where(q=>q.Name == temp[0])).Count==0)
{
     items.add(...);
}
于 2013-10-29T17:37:53.147 回答
0

使用 List 来存储 Item.Name 怎么样?然后在调用 items.Add() 之前检查 List.Contains()

很简单,只需要 3 行代码,就可以了。

IList<string> listNames = new List();
//
for (int i = 0; i < lines.Count; i++)
{
    //
    var temp = columns[5].Split('|', '>');
    if (!listNames.Contains(temp[0]))
    {
        listNames.Add(temp[0]);
        items.Add(new Item() 
        { 
            //
        });
    }
}
于 2013-10-30T04:37:22.070 回答