проблема в linq с разделением запятой строки - PullRequest
0 голосов
/ 30 ноября 2009

Я использую следующее для преобразования строки, разделенной запятыми, в список.

string productId ="1,2";
string productName = "Product1,Product2";
string prodCat = "Cat1,Cat1";
string quantity = "10,10";
string retailPrice = "12,12";

var _productId = new List<String>(productId.Trim().Split(','));
var _productName = new List<String>(productName.Trim().Split(','));
var _prodCat = new List<String>(prodCat.Trim().Split(','));
var _quantity = new List<String>(quantity.Trim().Split(','));
var _retailPrice = new List<String>(retailPrice.Trim().Split(','));
var _products = (from pi in _productId
                join pro in _productName on _productId.IndexOf(pi) equals _productName.IndexOf(pro)
                join pn in _prodCat on _productId.IndexOf(pi) equals _prodCat.IndexOf(pn)
                join rp in _retailPrice on _productId.IndexOf(pi) equals _retailPrice.IndexOf(rp)
                join q in _quantity on _productId.IndexOf(pi) equals _quantity.IndexOf(q)
                where pi.Length > 0 && pro.Length > 0 
                select pi);

_products.Dump("Products");

Запрос Above возвращает другой результат:

Products

IEnumerable<String> (8 items)  
1
1
1
1
1
1
1
1

Но это должно быть:

Products

IEnumerable<String> (2 items)  
1
2

Если у меня разные значения во всех строках, я получу фактический результат. Здесь, в приведенном выше примере, у меня есть та же категория, количество и цена для двух разных продуктов. Но я получаю результат с восемью неправильными значениями.

Есть хоть какая-то подсказка, почему так происходит?

Ответы [ 2 ]

1 голос
/ 30 ноября 2009

Вы пытаетесь сделать что-то подобное?

var _products = Enumerable.Range(0, _productId.Count)
                          .Select(i => new
                              {
                                  Id = _productId[i],
                                  Name = _productName[i],
                                  Cat = _prodCat[i],
                                  Quantity = _quantity[i],
                                  RetailPrice = _retailPrice[i]
                              });
1 голос
/ 30 ноября 2009

Похоже, вы читаете файл CSV. Если это так, лучше использовать CsvReader или другую библиотеку. В файле CSV есть только мелочи, которые можно пропустить.

Что касается вашего вопроса. Почему бы просто не построить нормальные объекты и использовать обычный Linq? Как это:

class Product {
    public string Id { get; set; }
    public string Name { get; set; }
    public string Category {get; set; }
    public int Quantity { get; set; }
    public decimal RetailPrice { get; set; }
}

IList<Product> products = new List<Product>();
for (int i=0; i < _productId.Length; i++) {
    products[i] = new Product {
        Id = _productId[i],
        Name = i < _productName.Length ? _productName[i] : null,
        Category = i < _prodCat.Length ? _prodCat[i] : null,
        Quantity= i < _quantity.Length ? int.Parse(_quantity[i]) : 0 // etc
    };
}

// Then use normal Linq2Objects:
_products = products
    .Where(c => !string.IsNullOrEmpty(c.Category))
    .Where(n => !string.IsNullOrEmpty(n.Name))
    .Select(x => x.Id);
_products.Dump("Products")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...